Ralat Penukaran Antara Muka Tiada kepada Penunjuk dalam GoLang
Dalam GoLang, cuba menukar antara muka nol kepada penunjuk jenis tertentu, sebagai digambarkan di bawah, mencetuskan ralat:
type Nexter interface { Next() Nexter } type Node struct { next Nexter } func (n *Node) Next() Nexter {...} func main() { var p Nexter var n *Node fmt.Println(n == nil) // true n = p.(*Node) // error }
Ralat ini berlaku kerana pembolehubah jenis statik jenis antara muka (cth., Nexter) boleh memegang nilai pelbagai jenis dinamik, termasuk nol. Walaupun ada kemungkinan untuk menukar nilai nol kepada penunjuk menggunakan (*Nod)(nil), jenis penegasan seperti yang digunakan dalam contoh tidak boleh digunakan kerana:
x.(T)
memerlukan x menjadi bukan- nil dan jenis T. Dalam kes ini, p mungkin mengandungi nilai pelbagai jenis atau nil.
Sebaliknya, eksplisit cek boleh digunakan:
if p != nil { n = p.(*Node) // succeeds if p contains a *Node value }
Sebagai alternatif, borang "koma-ok" menyediakan pilihan yang lebih selamat:
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) }
Menggunakan borang "koma-ok" membenarkan pengendalian kedua-dua sifar dan nilai antara muka bukan nol tanpa mencetuskan panik.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Antara Muka Nil kepada Penunjuk dengan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!