您无法分辨出差异,无法跟踪是否设置了字段(或变量)。
使用指针
您可以使用
nil
值为零的指针,因此,如果未设置该指针,则可以知道:
type test struct { testIntOne *int testIntTwo *int}func main() { s := test{testIntOne: new(int)} fmt.Println("testIntOne set:", s.testIntOne != nil) fmt.Println("testIntTwo set:", s.testIntTwo != nil)}输出(在Go Playground上尝试):
testIntOne set: truetestIntTwo set: false
当然
new()只能用于获得指向一个
int值的指针
0。
使用方法
您还可以使用一种方法来设置字段,这可以帮助您额外跟踪“
isSet”属性。在这种情况下,您必须始终使用提供的方法来设置字段。最好是使字段不导出,这样其他人(包外部)将无法直接访问它们。
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) fmt.Println("testIntTwo set:", s.twoSet)}输出(在Go Playground上尝试):
testIntOne set: truetestIntTwo set: false



