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

type Student struct{

    Name string

    No int

}


student:=Student{

    Name:"Lily",

}

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


哈士奇WWW
浏览 127回答 5
5回答

qq_花开花谢_0

如果你定义No为整数,那么如果它没有被赋值,golang 会将它设置为0(默认值),这有时会根据你使用它的目的而造成混淆(例如,if0是 的有效值No)。如果你真的想检查是否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)}

慕工程0101907

您将变量定义为指针变量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 时使用这种技术,以查明是否提供了一个字段,以及在扫描可为 null 的值表单数据库时。要取回价值,您必须使用*student.NO 

茅侃侃

该字段将具有该数据类型的零值。在本例中为 0。您的支票将如下所示:student.No == 0起初这看起来有点奇怪。但在这种情况下,0作为数字的 a 作为有效的学生编号没有意义。

繁星coding

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

眼眸繁星

如果不手动比较结构的每个字段,就没有其他方法可以检查是否设置了某个值。这就是为什么在stdlib许多包中都有方法的原因New...。例如bufio.NewWriter(),包的作者负责根据自己的用例使用一些合理的默认值初始化结构。// NewStudent returns new Student instancefunc NewStudent() *Student {    return &Student{Name: "defaultName", No: 7}}即使Student导出类型,您的包用户也应该New...使用任何结构。还有另一种方法可以解决这个问题,但对于许多程序来说可能过于复杂,但您可以在此处和此处阅读有关它们的信息。
打开App,查看更多内容
随时随地看视频慕课网APP