Pointers 在结构中使用指针有缺点吗?

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

我正在使用mysql,并将结果返回到一个结构数组中

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
}

缺点很简单,但主要也是优点:

  • 现在有一个指针可以是nil。您可能需要以不同的方式处理这种情况(因为指针可能为nil),这意味着您必须编写更多的代码。这也是它的优点:您可能需要以不同的方式处理这种情况(即,对于您希望解决的问题),在这种情况下,您需要一种方法来标记“不存在”与“内容是”。将指针设置为nil的功能提供了这种区别

  • 因为涉及到一个指针,所以您可以共享底层数据。这也是它自身的优势

  • 实际上,使用数据需要一个额外的间接级别。(这是一个纯粹的劣势,这里没有优势。)


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