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

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

Patricia Arquette
發布: 2024-12-18 15:00:18
原創
511 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板