Saya melihat banyak kode di Go untuk mendeteksi nihil, seperti ini:
if err != nil {
// handle the error
}
Namun, saya memiliki struct seperti ini:
type Config struct {
host string
port float64
}
dan config adalah turunan dari Config, ketika saya melakukannya:
if config == nil {
}
ada kesalahan kompilasi, mengatakan: tidak dapat mengonversi nil untuk mengetik Config
Jawaban:
Compiler menunjuk kesalahan kepada Anda, Anda membandingkan contoh struktur dan nil. Mereka bukan dari jenis yang sama sehingga menganggapnya sebagai perbandingan yang tidak valid dan berteriak pada Anda.
Yang ingin Anda lakukan di sini adalah membandingkan sebuah pointer ke instance config Anda dengan nil, yang merupakan perbandingan yang valid. Untuk melakukan itu Anda bisa menggunakan golang builtin baru , atau menginisialisasi pointer ke sana:
atau
atau
Maka Anda akan dapat memeriksa apakah
sumber
var config &Config // nil
seharusnya:var config *Config
var config *Config
crash denganinvalid memory address or nil pointer dereference
. Mungkin kita perluvar config Config
Selain Oleiade, lihat spesifikasi pada nilai nol :
Seperti yang Anda lihat,
nil
bukan nilai nol untuk setiap jenis tetapi hanya untuk pointer, fungsi, antarmuka, irisan, saluran dan peta. Ini adalah alasan mengapaconfig == nil
ada kesalahan dan&config == nil
tidak.Untuk memeriksa apakah struct Anda belum diinisialisasi, Anda harus memeriksa setiap anggota untuk nilai nol masing-masing (mis
host == ""
.port == 0
, Dll.) Atau memiliki bidang pribadi yang ditetapkan oleh metode inisialisasi internal. Contoh:sumber
time.Time
memilikiIsZero()
metode. Namun Anda juga bisa melakukanvar t1 time.Time; if t1 == time.Time{}
dan Anda juga bisa melakukanif config == Config{}
untuk memeriksa semua bidang untuk Anda (kesetaraan struct didefinisikan dengan baik di Go). Namun, itu tidak efisien jika Anda memiliki banyak bidang. Dan, mungkin nilai nol adalah nilai yang waras dan dapat digunakan sehingga melewati satu di tidak istimewa.func (c *Config) Initialized() bool { return !(c == nil) }
Saya telah membuat beberapa kode sampel yang menciptakan variabel baru menggunakan berbagai cara yang dapat saya pikirkan. Sepertinya 3 cara pertama membuat nilai, dan dua yang terakhir membuat referensi.
yang keluaran:
sumber
Anda juga dapat memeriksa suka
struct_var == (struct{})
. Ini tidak memungkinkan Anda untuk membandingkan dengan nol tetapi memeriksa apakah itu diinisialisasi atau tidak. Hati-hati saat menggunakan metode ini. Jika struct Anda dapat memiliki nilai nol untuk semua bidangnya, Anda tidak akan bersenang-senang.http://play.golang.org/p/RXcE06chxE
sumber
Spesifikasi bahasa menyebutkan perilaku operator perbandingan:
operator pembanding
Penugasan
sumber
Di Go 1.13 dan yang lebih baru, Anda dapat menggunakan
Value.IsZero
metode yang ditawarkan dalamreflect
paket.Selain tipe dasar, ini juga berfungsi untuk Array, Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer, dan Struct. Lihat ini untuk referensi.
sumber