首页 > 解决方案 > 如何在结构中创建可为空的字段

问题描述

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

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为零。

我怎样才能做到这一点?

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

标签: gonullable

解决方案


对于空字段,您可以检查零值的空值,在结构的情况下不为零。

当通过声明或 new 调用为变量分配存储空间时,或者通过复合文字或 make 调用创建新值时,并且未提供显式初始化,则给出变量或值默认值。此类变量或值的每个元素的类型都设置为零值:布尔值为 false,数字类型为 0,字符串为 "",指针、函数、接口、切片、通道和映射为 nil。

在您的情况下,使用的是 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

创建作为指针的结构字段。

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

推荐阅读