Mysql 如何在Go中安全地检测struct的归零值?
我试图为MySQL编写一个简单的ORM,但遇到了一个问题,如果定义的结构缺少某个字段: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"} 用户的某些字段没有给定值,那么它的值将是零
type User struct {
ID int64
Username string
Password string
Email string
Comment string
}
var u = User{Username: "user_0001", Password: "password"}
用户的某些字段没有给定值,那么它的值将是零值,例如string“”
、boolfalse
、integer0
等等
所以我使用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