Go 如何查找未分配的结构字段

Go 如何查找未分配的结构字段,go,Go,那么,我怎么知道学生的字段“否”没有被分配呢?该字段对于该数据类型将具有零值。在本例中为0。您的支票如下所示: type Student struct{ Name string No int } student:=Student{ Name:"Lily", } 一开始这可能有点奇怪。但是在这种情况下,0作为一个数字,作为一个有效的学生号是没有意义的。围棋中的每个数据类型都有它自己的零值。所以,在任何数字情况下,它都是0。您可以检查No的值是否为0

那么,我怎么知道学生的字段“否”没有被分配呢?

该字段对于该数据类型将具有零值。在本例中为0。您的支票如下所示:

type Student struct{
    Name string
    No int
}

student:=Student{
    Name:"Lily",
}

一开始这可能有点奇怪。但是在这种情况下,0作为一个数字,作为一个有效的学生号是没有意义的。

围棋中的每个数据类型都有它自己的零值。所以,在任何数字情况下,它都是0。您可以检查No的值是否为0


更多信息->

如果不手动比较结构的每个字段,没有其他方法可以检查是否设置了某个值

这就是为什么在stdlib中许多包都有新的方法

例如bufio.NewWriter,其中包的作者负责根据自己的用例使用一些正常的默认值初始化结构

student.No == 0
即使导出了学生类型,您的包用户也应该使用新的。。。使用任何结构

还有另一种方法可以解决这个问题,但对于许多程序来说,它可能太长了,但您可以阅读有关它们的内容。

如果您将“否”定义为整数,则如果未分配“否”,golang会将其设置为0默认值,这有时可能会因您使用它的目的而混淆。例如,如果0是“否”的有效值

如果您确实想检查是否分配了Student.No。我认为最好使用指针


下面是代码:

您可以将变量定义为指针变量

type Student struct{
    Name string
    No *int
}

student:= Student{
    Name:"Lily",
}

if student.No == nil {
    fmt.Println("student.No is not defined")
}

student2 := Student{
    Name: "Bob",
    No: func(i int) *int{ return &i}(5),
}

if student2.No != nil {
    fmt.Printf("student.No is %d\n", *student2.No)
}
在这种情况下,如果你这样做

type Student struct{
    Name string
    No *int
}

student:=Student{
    Name:"Lily",
}
会打印出来的

if student.No==nil{
    fmt.Println("Yes I'm unassigned")
}
我们可以在解组json时使用此技术,以确定是否提供了字段,并在扫描可空值表单数据库时使用此技术。要恢复价值,您必须使用

Yes I'm unassigned

我会说默认值而不是零值,其中整数是0,字符串是双引号,指针是nil,等等go tour页面本身称之为零值->@mchar和Andy:不仅go tour,规范也称之为go tour,我想换言之,这是一样的。很好地澄清了这一点。最好使用指针。仅检查No的值是否为0是不够的。如果Student.No由0分配,则该选项将不起作用
Yes I'm unassigned
*student.NO