结构体字段的默认值
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中文网其他相关文章!