結構體欄位的預設值
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中文網其他相關文章!