Menukar Antara Muka Nil kepada Penunjuk Jenis dalam Golang
Apabila cuba menukar antara muka nol kepada penunjuk jenis tertentu, ralat berlaku: "penukaran antara muka: antara muka tiada". Untuk memahami sebab ini gagal, adalah penting untuk memahami perbezaan antara jenis statik dan dinamik.
Seterusnya ialah antara muka, yang menentukan jenis statik. Pembolehubah jenis Nexter boleh menyimpan nilai pelbagai jenis dinamik yang melaksanakan antara muka Nexter, seperti *Nod atau jenis tersuai lain. Apabila pembolehubah antara muka nil diberikan kepada pembolehubah penunjuk, adalah mustahil untuk menentukan jenis dinamik sebenar nilai yang dipegangnya (kerana ia tidak memegang satu pun).
Akibatnya, penegasan jenis, yang biasanya digunakan dalam bentuk x.(T) untuk menegaskan bahawa x adalah jenis T dan membuangnya kepada T, gagal. Ini kerana spesifikasi bahasa Go menyatakan dengan jelas bahawa x.(T) hanya berfungsi apabila x bukan nol. Menggunakan penegasan jenis pada pembolehubah antara muka nil akan mengakibatkan panik masa jalan.
Untuk mencapai kesan yang serupa dengan n = p.(*Nod) tetapi bermula dari antara muka nil, pendekatan berikut boleh digunakan:
var p Nexter = (*Node)(nil)
Nilai antara muka sebenarnya memegang sepasang (nilai, jenis dinamik). Dalam kes ini, p bukan nol tetapi memegang sepasang (nil, *Nod). Ini membolehkan penegasan jenis pada p berjaya.
Sebagai alternatif, untuk mengendalikan nilai nil secara eksplisit, gunakan borang "koma-ok":
if n, ok := p.(*Node); ok { fmt.Printf("n=%#v\n", n) }
Borang "koma-ok" memastikan bahawa tiada panik masa jalan berlaku, dan ok akan menjadi palsu jika penegasan gagal (iaitu, p memegang nilai sifar atau nilai yang berbeza taip).
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Antara Muka Nil kepada Penunjuk dengan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!