Menguji Nilai Nil dalam struct Kompleks dalam Go
Apabila berurusan dengan struktur bersarang dalam dalam Go yang mungkin mengandungi medan pilihan atau ditinggalkan, kehadiran nilai sifar boleh menjadi kebimbangan. Untuk menangani isu ini, seseorang biasanya menghadapi kebosanan menulis pernyataan berbilang if untuk menyemak rujukan tiada potensi. Ini boleh memakan masa dan terdedah kepada ralat.
Pendekatan yang lebih elegan dan cekap untuk menangani situasi ini ialah menggunakan penerima penuding dalam kaedah pengambil tersuai. Teknik ini diguna pakai dalam kod Go yang dijana oleh protobuf dan mendayakan perangkaian semula jadi bagi panggilan kaedah tanpa perlu risau tentang ralat nyahrujuk penuding nil.
Dalam contoh yang disediakan, struktur Bar dan Baz digunakan sebagai penunjuk. Dengan menambahkan getter pada struct ini, kami boleh mengendalikan rujukan nol dengan selamat:
func (b *Bar) GetBaz() *Baz { if b == nil { return nil } return b.Baz } func (b *Baz) GetBaz() string { if b == nil { return "" } return b.Baz }
Kaedah getter ini melakukan semakan nol pada penerima sebelum cuba mengakses mana-mana medan. Jika penerima adalah sifar, mereka mengembalikan nilai sifar untuk jenis hasil.
Dengan adanya kaedah pengambil ini, ujian untuk nilai sifar menjadi mudah:
fmt.Println(f3.Bar.GetBaz().GetBaz()) // No panic fmt.Println(f2.Bar.GetBaz().GetBaz()) // No panic fmt.Println(f1.Bar.GetBaz().GetBaz()) // No panic if baz := f2.Bar.GetBaz(); baz != nil { fmt.Println(baz.GetBaz()) } else { fmt.Println("something nil") }
Pendekatan ini menyediakan kaedah generik dan penyelesaian yang selamat untuk menguji nilai sifar dalam struktur bersarang, menghapuskan keperluan untuk pernyataan jika berulang dan meminimumkan risiko ralat masa jalan akibat penunjuk sifar dereference.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Nilai Nil dengan Selamat dalam Nested Go Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!