【问题标题】:Is there a disadvantage of using a pointer in a struct?在结构中使用指针有缺点吗?
【发布时间】: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 值,并且您应该在数据库查询代码中或从数据库连接读取数据时将 SQL NULL 值合并为空字符串。
  • 因为 Go 指针不像 C/C++ 指针(例如 stackoverflow.com/questions/38234487/… ),您至少不需要担心生命周期管理 - 但是在使用指针时,您仍然需要推理它何时是安全地取消引用它们。例如,考虑使用始终具有有效字符串成员的不可变类型来减轻您的责任。
  • 不只是何时取消引用它们 - 您还必须考虑竞争条件(不包括字符串指针,因为字符串是不可变的)和 GC 压力(值被复制,因此通常分配在堆栈上,而任何指针逃逸将被分配到堆中并受制于 GC)。
  • 谢谢大家,我将使用 MySQL 的 COALESCE 选项。但显然问题是,看着反对票,但我得到了帮助!

标签: pointers go struct


【解决方案1】:

缺点很简单,但它们大多也是优点:

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

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

  3. 实际使用数据需要额外一层间接。 (这是纯粹的劣势——这里没有优势。)

【讨论】:

  • 指针也可以逃逸,这要求它们分配在堆上,这受GC的影响。受 GC 影响的对象越多,您的应用程序在 GC 上花费的时间就越多。
  • @Adrian:字符串也可以转义,所以它在那里的结果是一样的。
  • @Adrian True;我是针对所提出的问题的。如果您有更简单的数据类型(例如int),那么第 3 点的缺点通常包括额外的 GC 工作以及使用数据的额外指针跟踪工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多