Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menukar Antara Muka Nil kepada Penunjuk dengan Selamat dalam Go?

Bagaimana untuk Menukar Antara Muka Nil kepada Penunjuk dengan Selamat dalam Go?

DDD
Lepaskan: 2024-12-19 14:01:16
asal
195 orang telah melayarinya

How to Safely Convert a Nil Interface to a Pointer in Go?

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
}
Salin selepas log masuk

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)
Salin selepas log masuk

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
}
Salin selepas log masuk

Sebagai alternatif, borang "koma-ok" menyediakan pilihan yang lebih selamat:

if n, ok := p.(*Node); ok {
    fmt.Printf("n=%#v\n", n)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan