默认结构值

  • 本文关键字:结构 默认 go struct
  • 更新时间 :
  • 英文 :


在Go中我得到类型有默认值。在这种情况下以int为初始化为0。

我有一个问题,对于我来说,int中的0可以是一个有效的值,因此我需要检查它是由我设置还是初始化的。有什么方法可以说出它们之间的区别吗?

考虑以下代码...我需要能够分辨testIntOnetestIntTwo之间的区别,但它们看起来相同!

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

最新更新