Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在Go中安全地检测struct的归零值?_Mysql_Go - Fatal编程技术网

Mysql 如何在Go中安全地检测struct的归零值?

Mysql 如何在Go中安全地检测struct的归零值?,mysql,go,Mysql,Go,我试图为MySQL编写一个简单的ORM,但遇到了一个问题,如果定义的结构缺少某个字段: type User struct { ID int64 Username string Password string Email string Comment string } var u = User{Username: "user_0001", Password: "password"} 用户的某些字段没有给定值,那么它的值将是零

我试图为MySQL编写一个简单的ORM,但遇到了一个问题,如果定义的结构缺少某个字段:

type User struct {
    ID        int64
    Username  string
    Password  string
    Email     string
    Comment   string
}

var u = User{Username: "user_0001", Password: "password"}
用户的某些字段没有给定值,那么它的值将是零值,例如string
“”
、bool
false
、integer
0
等等

所以我使用
reflect
来获取字段名和值,生成一个sql来插入行

在用户(Id、用户名、密码、电子邮件、注释)中插入值(0、“用户0001”、“密码”、)


您可以看到字符串中有一些归零的值,如果我检测到空字符串
并跳过它们,我可能会跳过正常值

您总是可以在表列中插入一个空字符串。如果知道零值与完全没有值之间的差异确实很重要,则需要使用指针

type User struct {
    ID        int64
    Username  *string
}
这会将零值更改为
nil
,因此您可以将其与
区分开来。 缺点是,这使得该类型不太容易使用(
nil
检查在实践中经常被忘记),您必须取消对该字段的引用以获得实际字符串


在您的特定示例中,我完全不明白您为什么需要担心空值。您不能将
插入数据库,并在代码中强制验证(非空),而不是使用数据库约束吗?

您始终可以将空字符串插入表列中。如果知道零值与完全没有值之间的差异确实很重要,则需要使用指针

type User struct {
    ID        int64
    Username  *string
}
这会将零值更改为
nil
,因此您可以将其与
区分开来。 缺点是,这使得该类型不太容易使用(
nil
检查在实践中经常被忘记),您必须取消对该字段的引用以获得实际字符串


在您的特定示例中,我完全不明白您为什么需要担心空值。你能不能只在数据库中插入
,并在代码中强制验证(非空),而不是使用数据库约束?

要处理可能为
NULL的数据库列,你可以按照Friedrich Große的建议使用指针,或者使用
db
包中的
NULL…
-变量,比如说

要使用空变量,结构将是

type User struct {
    ID        int64
    Username  string
    Password  string
    Email     sql.NullString
    Comment   sql.NullString
}
然后,您可以通过检查
NullString.Valid
来检测是否设置了值。使用
NullString
的缺点是在打印或封送它们时必须添加特殊情况,因为它们不实现接口,也不实现
MarshalJSON
UnmarshalJSON
。设置字符串值时,还必须记住手动设置
NullString.Valid

例如,像这样的测试

func TestNullString(t *testing.T) {
    s := sql.NullString{}
    t.Log(s)

    s.String = "Test"
    s.Valid = true
    t.Log(s)
}
印刷品

null_string_test.go:21: { false}
null_string_test.go:25: {Test true}
要打印
空字符串
,您必须执行以下操作

func TestNullString(t *testing.T) {
    s := sql.NullString{}
    t.Log(s.String)

    s.String = "Test"
    s.Value = true
    t.Log(s.String)
}
其中打印:

null_string_test.go:21: 
null_string_test.go:25: Test

要处理可能为
NULL
的数据库列,您可以按照Friedrich Große的建议使用指针,或者使用
NULL…
-例如,在
db
包中找到的变体

要使用空变量,结构将是

type User struct {
    ID        int64
    Username  string
    Password  string
    Email     sql.NullString
    Comment   sql.NullString
}
然后,您可以通过检查
NullString.Valid
来检测是否设置了值。使用
NullString
的缺点是在打印或封送它们时必须添加特殊情况,因为它们不实现接口,也不实现
MarshalJSON
UnmarshalJSON
。设置字符串值时,还必须记住手动设置
NullString.Valid

例如,像这样的测试

func TestNullString(t *testing.T) {
    s := sql.NullString{}
    t.Log(s)

    s.String = "Test"
    s.Valid = true
    t.Log(s)
}
印刷品

null_string_test.go:21: { false}
null_string_test.go:25: {Test true}
要打印
空字符串
,您必须执行以下操作

func TestNullString(t *testing.T) {
    s := sql.NullString{}
    t.Log(s.String)

    s.String = "Test"
    s.Value = true
    t.Log(s.String)
}
其中打印:

null_string_test.go:21: 
null_string_test.go:25: Test