Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Kita Boleh Membezakan Antara Medan Struktur Ditetapkan Secara Eksplisit dan Dimulakan Lalai dalam Go?

Bagaimanakah Kita Boleh Membezakan Antara Medan Struktur Ditetapkan Secara Eksplisit dan Dimulakan Lalai dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-18 15:00:18504semak imbas

How Can We Distinguish Between Explicitly Set and Default-Initialized Struct Fields in 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!

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