如何查找未在golang中分配的struct字段?

时间:2018-11-02 07:02:50

标签: go

type Student struct{
    Name string
    No int
}

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

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

5 个答案:

答案 0 :(得分:4)

如果您将No定义为整数,那么如果未分配,golang会将其设置为0(默认值),这有时会因您的使用目的而引起混淆(例如,如果0No的有效值)。

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

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)
}

这是代码:https://play.golang.org/p/_lhbQcDA_eb

答案 1 :(得分:2)

该字段的该数据类型的值为零。在这种情况下为0。您的支票将如下所示:

student.No == 0

乍一看,这似乎有些奇怪。但是在这种情况下,将0作为一个数字作为有效的学生编号是没有意义的。

答案 2 :(得分:2)

Go中的每种数据类型都有其自己的“零值”。因此,在Nonumber)的情况下,它是0。您可以检查No的值是否为0

更多信息在这里-> https://tour.golang.org/basics/12

答案 3 :(得分:2)

您将变量定义为指针变量

type Student struct{
    Name string
    No *int
}

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

在这种情况下,如果您这样做

if student.No==nil{
    fmt.Println("Yes I'm unassigned")
}

它将打印

Yes I'm unassigned

我们可以在解组json时使用此技术,以查找是否提供了字段,并在扫描可为空的值表单数据库时使用。要获得价值,您必须使用

*student.NO 

答案 4 :(得分:1)

没有其他方法可以在不手动比较结构的每个字段的情况下检查是否设置了某个值。

这就是为什么在stdlib中许多程序包都使用方法New...的原因。

例如bufio.NewWriter(),其中包的作者负责根据自己的用例用一些合理的默认值初始化结构。

// NewStudent returns new Student instance
func NewStudent() *Student {
    return &Student{Name: "defaultName", No: 7}
}

即使导出了Student类型,您的包用户也应该使用New...来使用任何结构。

还有另一种方法可以解决此问题,但是对于许多程序而言,这可能太麻烦了,但是您可以阅读有关herehere的内容。