首頁 >後端開發 >Golang >我們如何區分 Go 中明確設定的結構體欄位和預設初始化的結構體欄位?

我們如何區分 Go 中明確設定的結構體欄位和預設初始化的結構體欄位?

Patricia Arquette
Patricia Arquette原創
2024-12-18 15:00:18507瀏覽

How Can We Distinguish Between Explicitly Set and Default-Initialized Struct Fields in Go?

結構體欄位的預設值

Go 根據資料型別使用預設值初始化結構體欄位。例如,整數欄位初始化為 0。但是,此預設值有時可能是有效值,因此很難區分未明確設定的欄位和已預設初始化的欄位。

範例:

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?
}

無法區分值

不幸的是,Go 內建方法來區分未初始化的欄位和初始化為預設值的欄位。

解決方案:

要解決這個問題,請考慮幾個替代方案方法:

1。使用指標

指標有一個空值nil,它不同於0。透過初始化指標字段,我們可以輕鬆檢查它們是否已設定。

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 .使用方法

您也可以使用方法來控製欄位的初始化。在這種情況下,我們可以追蹤是否設定了一個標誌來指示該欄位是否已手動初始化。

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
}

以上是我們如何區分 Go 中明確設定的結構體欄位和預設初始化的結構體欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn