在Go中我得到类型有默认值。在这种情况下以int为初始化为0。
我有一个问题,对于我来说,int中的0可以是一个有效的值,因此我需要检查它是由我设置还是初始化的。有什么方法可以说出它们之间的区别吗?
考虑以下代码...我需要能够分辨testIntOne
和testIntTwo
之间的区别,但它们看起来相同!
package main
import "log"
type test struct {
testIntOne int
testIntTwo int
}
func main() {
s := test{testIntOne: 0}
log.Println(s)
}
您无法分辨出差异,是否设置了字段(或变量)。
使用指针
您可以使用具有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操场上尝试):
testIntOne set: true
testIntTwo set: false
当然,new()
只能用于获得int
值为0
的指针。请参阅此问题以获取更多选择:我如何在GO中进行字面 *INT64?
使用方法
您还可以使用方法来设置字段,该字段可以额外跟踪" 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操场上尝试):
testIntOne set: true
testIntTwo set: false