Pointers 在结构中使用指针有缺点吗?
我正在使用mysql,并将结果返回到一个结构数组中Pointers 在结构中使用指针有缺点吗?,pointers,go,struct,Pointers,Go,Struct,我正在使用mysql,并将结果返回到一个结构数组中 type User struct { FirstName string LastName string } Go不允许nil值作为字符串,但是如果我使用字符串指针 type User struct { FirstName *string LastName *string } 然后它是允许的,我可以将数据库中的空值解析为nil字符串 使用指针允许nil有什么特别的缺点吗?我为什么要使用更麻烦的NullStr
type User struct {
FirstName string
LastName string
}
Go不允许nil值作为字符串,但是如果我使用字符串指针
type User struct {
FirstName *string
LastName *string
}
然后它是允许的,我可以将数据库中的空值解析为nil字符串
使用指针允许nil有什么特别的缺点吗?我为什么要使用更麻烦的NullString方法呢
type NullString struct {
String string
Valid bool
}
缺点很简单,但主要也是优点:
问题:在您的应用程序中,空字符串和缺少字符串之间是否存在有意义的区别?如果不是,则坚持使用非指针
string
值,您应该在数据库查询代码中或从数据库连接读取数据时将SQLNULL
值合并为空字符串。因为Go指针与C/C++指针不同(例如)您至少不需要担心生命周期管理——但在使用指针时,您仍然需要考虑何时可以安全地取消引用它们。考虑使用不可变的类型,这些类型将始终具有有效的字符串成员,例如,减轻自己的责任。不仅仅是在取消引用时,还必须考虑竞争条件(不包括字符串指针,因为字符串是不可变的)和GC压力。(值被复制,因此通常在堆栈上分配,而任何转义的指针都将被分配到堆并受GC约束)。谢谢大家,我将使用MySQL中的COALESCE选项。但问题很明显,查看下行投票,但我得到了帮助!指针也可以转义,这要求它们分配到堆上,堆受GC约束。受GC约束的对象越多,应用程序在GC上花费的时间就越多。@Adrian:字符串也可以转义,所以结果也是一样的。@Adrian True;我是针对前面提到的问题的。如果您有更简单的数据类型(例如int
),那么所有缺点#3通常包括额外的GC工作以及使用数据的额外指针跟踪工作。