Suis Jenis dengan Berbilang Kes
Dalam Go, pernyataan suis jenis boleh digunakan untuk memilih kes yang sepadan secara dinamik berdasarkan jenis suatu nilai. Apabila berbilang jenis ditentukan dalam satu kes, ralat mungkin dibangkitkan jika jenis nilai tidak sepadan dengan mana-mana jenis yang disenaraikan.
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 kod ini dijalankan, ia menghasilkan ralat berikut:
a.test undefined (type interface {} is interface with no methods)
Ralat ini menunjukkan bahawa suis jenis tidak berkuat kuasa kerana pembolehubah a mempunyai antara muka jenis{}, yang tidak mempunyai kaedah test().
Spesifikasi bahasa Go menerangkan bahawa dalam pernyataan suis jenis, apabila berbilang jenis ditentukan dalam kes, pembolehubah diisytiharkan dalam kes itu akan mempunyai jenis ungkapan dalam pengawal suis jenis (dalam kes ini, foo). Memandangkan foo adalah jenis antara muka{}, a juga menjadi jenis antara muka{}.
Untuk menyelesaikan isu ini dan memastikan bahawa kaedah test() boleh dipanggil, anda boleh secara eksplisit menegaskan bahawa foo mempunyai ujian( ) kaedah sebelum melakukan suis jenis, seperti:
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } type tester interface { test() } func main() { var foo interface{} foo = &B{} if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() } }
Dengan menegaskan bahawa foo mempunyai kaedah test(), anda boleh mendapatkan nilai jenis yang sesuai dan panggil kaedah test() berjaya.
Atas ialah kandungan terperinci Bagaimana Menggunakan Berbilang Kes dengan Betul dalam Suis Jenis Go untuk Mengelakkan Ralat Kaedah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!