如何在Golang结构中创建可为空的字段?

时间:2018-08-24 05:47:20

标签: go

我是Golang的新手。

我正在努力进行表驱动测试,我想这样做:

testCases := []struct {
    name          string
    testUserID    uint
    expected      User // <- maybe nil
    expectedError error
}

因为被测试函数的返回值为*User, error

用户就是这样,它被定义为数据库方案。

type User struct {
  ID uint
  CreatedAt time.Time
  UpdatedAt time.Time
  ...
}

但是在这种情况下,我无法将expected设为零。

我该怎么做?

还是我做表驱动测试的方法是错误的?

3 个答案:

答案 0 :(得分:5)

对于空字段,您可以检查为零的空值,如果为struct,则该空值不为零。

  

当通过声明为变量分配存储空间时   或调用new或创建新值时(通过   复合文字或make的调用,并且没有显式初始化   如果提供,则变量或值被赋予默认值。每个元素   这样的变量或值的类型为其类型设置为零值:   对于布尔值,为false;对于数字类型,为0;对于字符串,为“”;对于布尔值,为nil   指针,函数,接口,切片,通道和映射。

在您的情况下,正在使用Struct而不是struct的指针。值不为nil,但为空

var user User
fmt.Println(user == User{}) // will print true

但是由于您的情况返回的值是指向结构*User, error的指针,因此您可以检查nil

var user *User
fmt.Println(user == nil) // will print true

创建一个指向struct字段的指针。

testCases := []struct {
    name          string
    testUserID    uint
    expected      *User // <- maybe nil
    expectedError error
}

答案 1 :(得分:1)

Go基本类型定义了零值,并且不能为nil。

如果您希望一个值简单地为nillable,请使其成为指针。

如果您不希望使用指针行为,则可以使用第三方程序包中的空类型,

例如https://github.com/guregu/null

例如,将int实现为:

type Int struct {
    Int   int
    Valid bool
}

另一种解决方案是编写具有可空值的自己的结构

答案 2 :(得分:1)

您还可以使用特殊的sql类型:

type structName struct {
    id sql.NullInt64
    name sql.NullString
    field sql.NullBool
}