【发布时间】:2019-10-31 22:52:42
【问题描述】:
我正在使用 mysql 并将结果返回到结构数组中。
type User struct {
FirstName string
LastName string
}
Go 不允许将 nil 值作为字符串,但如果我将字符串设为指针
type User struct {
FirstName *string
LastName *string
}
那么它是允许的,我可以将数据库中的 NULL 值解析为 nil 字符串。
使用指针允许 nil 是否有特定的缺点?为什么我应该使用比繁琐的 NullString 方法工作?
type NullString struct {
String string
Valid bool
}
【问题讨论】:
-
问题:在您的应用程序中,空字符串和缺少字符串之间是否存在有意义的区别?如果不是,则坚持使用非指针
string值,并且您应该在数据库查询代码中或从数据库连接读取数据时将 SQLNULL值合并为空字符串。 -
因为 Go 指针不像 C/C++ 指针(例如 stackoverflow.com/questions/38234487/… ),您至少不需要担心生命周期管理 - 但是在使用指针时,您仍然需要推理它何时是安全地取消引用它们。例如,考虑使用始终具有有效字符串成员的不可变类型来减轻您的责任。
-
不只是何时取消引用它们 - 您还必须考虑竞争条件(不包括字符串指针,因为字符串是不可变的)和 GC 压力(值被复制,因此通常分配在堆栈上,而任何指针逃逸将被分配到堆中并受制于 GC)。
-
谢谢大家,我将使用 MySQL 的 COALESCE 选项。但显然问题是,看着反对票,但我得到了帮助!