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
DDDasal
2024-12-19 14:01:16217semak imbas

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
}

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!

Kenyataan:
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