Go 如何在结构中创建可为空的字段
我正在努力进行表驱动测试,我想这样做:Go 如何在结构中创建可为空的字段,go,nullable,Go,Nullable,我正在努力进行表驱动测试,我想这样做: testCases := []struct { name string testUserID uint expected User // <- maybe nil expectedError error } 但是在这种情况下,我不能使预期的为零 我该怎么做 或者我做表驱动测试的方法是错误的?对于空字段,您可以检查空值,它是零值,对于struct,它不是零 当通过声明为变量分配存储时
testCases := []struct {
name string
testUserID uint
expected User // <- maybe nil
expectedError error
}
但是在这种情况下,我不能使预期的为零
我该怎么做
或者我做表驱动测试的方法是错误的?对于空字段,您可以检查空值,它是零值,对于struct,它不是零
当通过声明为变量分配存储时
或者调用new,或者当通过
复合文字或make调用,不需要显式初始化
如果提供,则为变量或值提供默认值。每个元素
此类变量或值的类型设置为零值:
布尔值为false,数字类型为0,字符串为“,”和nil
指针、函数、接口、切片、通道和映射
在您的情况下,您使用的是Struct,而不是指向Struct的指针。该值不是nil,但为空
var user User
fmt.Println(user == User{}) // will print true
但是,由于在您的情况下,返回的值是指向struct*User的指针,因此错误
您可以检查是否为nil
var user *User
fmt.Println(user == nil) // will print true
创建作为指针的结构字段
testCases := []struct {
name string
testUserID uint
expected *User // <- maybe nil
expectedError error
}
testCases:=[]结构{
名称字符串
testUserID单元
预期的*User/Go基本类型已定义零值,不能为零
如果您希望一个值可以简单地为nillable,则将其设为指针
testCases := []struct {
name string
testUserID uint
expected *User // <- maybe nil
expectedError error
}
如果不需要指针行为,可以使用第三方包中的null类型
e、 g
例如,int实现为:
type Int struct {
Int int
Valid bool
}
另一种解决方案是使用可空值编写自己的结构,您还可以使用特殊的sql类型:
type structName struct {
id sql.NullInt64
name sql.NullString
field sql.NullBool
}
SomeType
是一个结构或接口。请发布更多的代码信息。对不起,它是结构。对不起,SomeType是用户,它是结构。我编辑了我的问题,然后如果它是一个结构-使它成为一个指针。@Taichi为什么你认为你不能使expected
成为一个指针?这有什么标准吗,或者至少是官方的草稿,或者我是否打开?这是一个非常缺少的功能,在很多情况下,需要区分缺少的值和零值。例如,examResults.Score==0
(无分数),以及examResults.Score==nil
(未知分数)。