Menyemak Antara Muka Tiada dan Tiada dalam Go
Apabila bekerja dengan antara muka dalam Go, selalunya perlu menyemak sama ada antara muka adalah sifar atau mengandungi nilai nol. Walau bagaimanapun, pendekatan standard menggunakan pantulan boleh bertele-tele dan terdedah kepada ralat.
Sebagai contoh, pertimbangkan fungsi pembantu berikut:
func isNil(a interface{}) bool { defer func() { recover() }() return a == nil || reflect.ValueOf(a).IsNil() }
Fungsi ini menggunakan pantulan untuk menyemak sama ada nilainya sifar , tetapi ia memerlukan recover() tertunda untuk mengendalikan panik apabila jenis nilai tidak disokong.
Lebih Langsung Pendekatan
Seperti yang dicadangkan oleh jawapan kepada soalan asal, pendekatan yang lebih mudah dan boleh dipercayai ialah menggunakan perbandingan langsung untuk antara muka nil dan sentiasa membenarkan penugasan antara muka nil kepada yang tidak ditaip. Begini caranya:
func isNil(a interface{}) bool { return a == nil }
Fungsi ini akan menyemak dengan betul kedua-dua antara muka nil dan nilai nil dalam antara muka.
Apabila Tugasan (*T)(nil) Dibenarkan
Pendekatan yang digariskan di atas menganggap bahawa anda tidak akan sekali-kali memberikan (*T)(nil) kepada antara muka. Jika ini tidak berlaku, anda mungkin perlu menggunakan refleksi untuk menyemak nilai sifar:
func isNil(a interface{}) bool { if a == nil { return true } v := reflect.ValueOf(a) if v.Kind() == reflect.Ptr && v.IsNil() { return true } return false }
Walau bagaimanapun, secara amnya disyorkan untuk mengelak daripada memberikan (*T)(nil) kepada antara muka, kerana ia boleh membawa kepada pepijat halus. Dengan menguatkuasakan peraturan jangan sekali-kali menyimpan (*T)(nil) dalam antara muka, anda boleh memudahkan kod anda dan meningkatkan kebolehpercayaannya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memeriksa Antara Muka Tiada dan Nilai Nil dengan Boleh Dipercayai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!