5 回答
TA贡献1835条经验 获得超7个赞
如果你定义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)
}
TA贡献1887条经验 获得超5个赞
您将变量定义为指针变量
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
TA贡献1842条经验 获得超21个赞
该字段将具有该数据类型的零值。在本例中为 0。您的支票将如下所示:
student.No == 0
起初这看起来有点奇怪。但在这种情况下,0
作为数字的 a 作为有效的学生编号没有意义。
TA贡献1873条经验 获得超9个赞
如果不手动比较结构的每个字段,就没有其他方法可以检查是否设置了某个值。
这就是为什么在stdlib许多包中都有方法的原因New...。
例如bufio.NewWriter(),包的作者负责根据自己的用例使用一些合理的默认值初始化结构。
// NewStudent returns new Student instance
func NewStudent() *Student {
return &Student{Name: "defaultName", No: 7}
}
即使Student导出类型,您的包用户也应该New...使用任何结构。
还有另一种方法可以解决这个问题,但对于许多程序来说可能过于复杂,但您可以在此处和此处阅读有关它们的信息。
- 5 回答
- 0 关注
- 141 浏览
添加回答
举报