Pengendalian Ralat dalam Go: Menyelesaikan "Tidak Boleh Taip Suis pada Nilai Bukan Antara Muka"
Semasa cuba melaksanakan penegasan jenis dalam Go, anda mungkin menemui mesej ralat: "tidak boleh menaip suis pada nilai bukan antara muka." Ralat ini timbul apabila cuba melakukan suis jenis pada nilai yang bukan jenis antara muka.
Pertimbangkan coretan kod berikut:
package main import "fmt" import "strconv" type Stringer interface { String() string } type Number struct { v int } func (number *Number) String() string { return strconv.Itoa(number.v) } func main() { n := &Number{1} switch v := n.(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
Apabila menjalankan kod ini, anda akan menghadapi ralat "tidak boleh menaip suis pada nilai bukan antara muka". Untuk menyelesaikannya, kita perlu menghantar pembolehubah n ke jenis antara muka{} sebelum melaksanakan suis jenis.
switch v := interface{}(n).(type)
Bahan ini menukarkan jenis konkrit n (*Nombor) kepada antara muka jenis antara muka{ }. Antara muka dalam Go bertindak sebagai kontrak, membenarkan sebarang nilai disimpan dan diakses melalui kaedah biasa. Dengan menghantar n ke antara muka{}, kami kemudiannya boleh melakukan suis jenis pada nilai antara muka yang terhasil.
Apabila kami menjalankan kod yang diubah suai, ia akan berjaya mencetak "Stringer: 1", seperti yang dijangkakan. Ini menunjukkan bahawa penegasan jenis dalam Go memerlukan nilai sebagai jenis antara muka dan penghantaran ke antara muka{} membolehkan suis jenis pada nilai bukan antara muka.
Atas ialah kandungan terperinci Mengapa Saya Mendapat 'Tidak Boleh Menaip Suis pada Nilai Bukan Antara Muka' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!