Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Kita Boleh Membezakan Antara Medan Struktur Ditetapkan Secara Eksplisit dan Dimulakan Lalai dalam Go?
Nilai Lalai untuk Medan Struktur
Go memulakan medan struct dengan nilai lalai berdasarkan jenis datanya. Sebagai contoh, medan integer dimulakan kepada 0. Walau bagaimanapun, nilai lalai ini kadangkala boleh menjadi nilai yang sah, menjadikannya sukar untuk membezakan antara medan yang belum ditetapkan secara eksplisit dan yang telah dimulakan secara lalai.
Contoh:
type test struct { testIntOne int testIntTwo int } func main() { s := test{testIntOne: 0} // Initializes testIntOne to 0 // How can we determine whether testIntOne has been set explicitly or initialized to 0? }
ketidakupayaan untuk membezakan values
Malangnya, Go tidak mempunyai cara terbina dalam untuk membezakan antara medan yang tidak dimulakan dan medan yang dimulakan kepada nilai lalai.
Penyelesaian:
Untuk menyelesaikan masalah ini, pertimbangkan beberapa alternatif pendekatan:
1. Menggunakan Penunjuk
Penunjuk mempunyai nilai nol nol, yang berbeza daripada 0. Dengan memulakan medan penunjuk, kita boleh menyemak dengan mudah sama ada ia telah ditetapkan.
type test struct { testIntOne *int testIntTwo *int } func main() { s := test{testIntOne: new(int)} // new() возвращает указатель, инициализированный до нуля fmt.Println("testIntOne set:", s.testIntOne != nil) // Выведет true, так как testIntOne инициализирован fmt.Println("testIntTwo set:", s.testIntTwo != nil) // Выведет false, так как testIntTwo не инициализирован }
2 . Menggunakan Kaedah
Anda juga boleh menggunakan kaedah untuk mengawal pemulaan medan. Dalam kes ini, kita boleh menjejaki sama ada bendera telah ditetapkan yang menunjukkan sama ada medan itu dimulakan secara manual.
type test struct { testIntOne int testIntTwo int oneSet, twoSet bool // Флаги для отслеживания инициализации } func (t *test) SetOne(i int) { t.testIntOne, t.oneSet = i, true // Установка поля и флага } func (t *test) SetTwo(i int) { t.testIntTwo, t.twoSet = i, true // Установка поля и флага } func main() { s := test{} s.SetOne(0) // Вызов метода для инициализации fmt.Println("testIntOne set:", s.oneSet) // Выведет true fmt.Println("testIntTwo set:", s.twoSet) // Выведет false }
Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Membezakan Antara Medan Struktur Ditetapkan Secara Eksplisit dan Dimulakan Lalai dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!