type Student struct{
Name string
No int
}
student:=Student{
Name:"Lily",
}
那么,我怎么知道学生的字段“否”没有分配?
答案 0 :(得分:4)
如果您将No
定义为整数,那么如果未分配,golang会将其设置为0
(默认值),这有时会因您的使用目的而引起混淆(例如,如果0
是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)
}
答案 1 :(得分:2)
该字段的该数据类型的值为零。在这种情况下为0。您的支票将如下所示:
student.No == 0
乍一看,这似乎有些奇怪。但是在这种情况下,将0
作为一个数字作为有效的学生编号是没有意义的。
答案 2 :(得分:2)
Go中的每种数据类型都有其自己的“零值”。因此,在No
(number
)的情况下,它是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...
来使用任何结构。