Go 中的默认结构体值
在 Go 中,诸如 int 之类的基本类型都有默认值。对于 int,此默认值为 0。但是,很难区分手动设置的值 0 和默认值。
考虑以下结构:
type test struct { testIntOne int testIntTwo int }
如果我们创建一个结构体,其中一个字段设置为 0,我们无法判断另一个字段是否已设置或仍然具有默认值value:
package main import "log" func main() { s := test{testIntOne: 0} log.Println(s) }
解决方案
使用指针
一种解决方案是为字段使用指针。指针的零值为 nil,因此我们可以检查该字段是否已设置:
type test struct { testIntOne *int testIntTwo *int } func main() { s := test{testIntOne: new(int)} log.Println(s.testIntOne != nil) // Output: true log.Println(s.testIntTwo != nil) // Output: false }
使用方法
另一个解决方案是创建一个方法设置该字段并跟踪它是否已被设置。该字段本身应该不导出以防止直接访问:
type test struct { testIntOne int testIntTwo int oneSet, twoSet bool } func (t *test) SetOne(i int) { t.testIntOne, t.oneSet = i, true } func main() { s := test{} s.SetOne(0) log.Println(s.oneSet) // Output: true log.Println(s.twoSet) // Output: false }
以上是如何区分 Go 结构中的默认值和显式设置零值?的详细内容。更多信息请关注PHP中文网其他相关文章!