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
(未知分数)。