Dalam Go, suis jenis membolehkan anda memadankan nilai dengan berbilang jenis. Walau bagaimanapun, apabila menggunakan berbilang kes dalam suis jenis, memahami penetapan jenis pembolehubah menjadi penting.
Pertimbangkan coretan kod berikut:
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = A{} switch a := foo.(type) { case B, A: a.test() } }
Apabila melaksanakan kod ini, ralat ditimbulkan: a .test undefined (antara muka jenis {} ialah antara muka tanpa kaedah). Ralat ini berlaku kerana pembolehubah a mengekalkan antara muka jenis{}, walaupun terdapat suis jenis.
Untuk memahami tingkah laku ini, kita perlu merujuk kepada spesifikasi Go:
"TypeSwitchGuard mungkin termasuk pengisytiharan pembolehubah pendek Apabila borang itu digunakan, pembolehubah diisytiharkan pada permulaan blok tersirat dalam setiap klausa Dalam klausa dengan penyenaraian kes tepat satu jenis, pembolehubah mempunyai jenis itu; jika tidak, pembolehubah mempunyai jenis ungkapan dalam TypeSwitchGuard."
Dalam kes kami, memandangkan berbilang jenis (B dan A) dinyatakan dalam klausa kes, pembolehubah a menyimpan jenis ungkapan dalam TypeSwitchGuard, iaitu antara muka{}. Ini bermakna pengkompil tidak akan membenarkan kami memanggil kaedah test() pada a kerana antara muka{} tidak mempunyai kaedah test().
Untuk menyelesaikannya, kami boleh menggunakan penegasan jenis, yang membenarkan kita untuk menegaskan bahawa nilai mempunyai jenis tertentu. Berikut ialah versi kod yang dikemas kini yang menggunakan penegasan jenis:
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = &B{} if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() } }
Atas ialah kandungan terperinci Mengapa Suis Jenis dengan Berbilang Kes dalam Go Menghasilkan Ralat Kaedah 'tidak ditentukan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!