Saya hanya bekerja melalui tur Go , dan saya bingung tentang pointer dan antarmuka. Mengapa kode Go ini tidak dikompilasi?
package main
type Interface interface {}
type Struct struct {}
func main() {
var ps *Struct
var pi *Interface
pi = ps
_, _ = pi, ps
}
yaitu jika Struct
adalah Interface
, mengapa tidak *Struct
menjadi *Interface
?
Pesan kesalahan yang saya dapatkan adalah:
prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment:
*Interface is pointer to interface, not interface
func main() { var ps *Struct = new(Struct) var pi *Interface var i Interface i = ps pi = &i fmt.Printf("%v, %v, %v\n", *ps, pi, &i) i = *ps fmt.Printf("%v, %v, %v\n", *ps, pi, i) _, _, _ = i, pi, ps }
dan membuat kesimpulan sendiriJawaban:
Ketika Anda memiliki struct yang mengimplementasikan antarmuka, pointer ke struct yang mengimplementasikan antarmuka itu secara otomatis juga. Itu sebabnya Anda tidak pernah memiliki
*SomeInterface
prototipe fungsi, karena ini tidak akan menambah apa punSomeInterface
, dan Anda tidak perlu jenis semacam itu dalam deklarasi variabel (lihat pertanyaan terkait ini ).Nilai antarmuka bukan nilai struct beton (karena memiliki ukuran variabel, ini tidak akan mungkin), tetapi itu adalah jenis pointer (lebih tepatnya pointer ke struct dan pointer ke tipe ). Russ Cox menjelaskannya di sini :
Inilah sebabnya
Interface
, dan bukan*Interface
tipe yang tepat untuk memegang pointer ke implementasi structInterface
.Jadi, Anda harus menggunakan
sumber
var pi *Interface
.*SomeInterface
bukan hanya kesalahan kompilasi?Ini mungkin yang Anda maksud:
Kompilasi OK. Lihat juga di sini .
sumber
Berikut adalah cara yang sangat sederhana untuk menetapkan struct ke antarmuka:
https://play.golang.org/p/BRTaTA5AG0S
sumber
Saya menggunakan cara berikut
interface{}
sementara saya hanya mengkonsumsieventsI interface{}
sebagai argumen, saya masih dapat mengirim Struct Pointer seperti yang Anda lihat di bawah.main.go
Sekarang di dalam
storyboard.go
file Buat fungsiSeperti yang dapat Anda lihat di atas Storyboard.go hanya memakan waktu
Events []interface{}
tetapi sebenarnya pengiriman Im adalah pointer Struct dan berfungsi dengan baik.contoh lain di sini
sumber