【问题标题】:Should I always use pointers when having a struct which contains others structs?当结构包含其他结构时,我是否应该始终使用指针?
【发布时间】:2014-04-26 09:33:34
【问题描述】:

我们有:

type A struct {
  Name  string
  Value string
}

type B struct {
  //
  First  *A
  Second A
}

首先:在B 中,使用*AA 哪个更有效?

第二个:当实例化B 时,我会使用b := &B{ ... },因此有一个指向B 的指针。所有以B 作为接收者的函数都使用func (*B) ... 作为签名,因此只对指针进行操作。既然我总是有一个指向B 的指针,那么B 由什么组成真的很重要吗?如果我总是使用指针,无论B 有什么字段,我总是传递一个指向B 的指针,并且在传递*B 时永远不会复制Second A 的值。还是我错过了什么?

【问题讨论】:

    标签: go


    【解决方案1】:

    没有唯一的正确答案。这始终取决于您的用例。

    一些指导:

    1. 将语义原因置于效率考虑之上
    2. A 为“大”时使用指针
    3. 在不允许B 编辑A 时避免使用指针

    您的第二个陈述是正确的。但是当你有很多 B 的实例时,使用指针会显着提高效率(如果结构体 A 明显大于指针的大小)。

    如果您有疑问,请针对用例进行衡量,然后确定最佳解决方案。

    【讨论】:

    • 很好的答案,谢谢。迭代数据怎么样。我知道这在很大程度上取决于用例,但如果我有数组:[100]A[100]*A,使用指针数组会更好吗?与迭代值相比,取消引用值是否有任何开销?
    【解决方案2】:

    只想添加到 Sebastian 的答案:如果您希望它是 nil,请使用 *A。这在编组 JSON 或将结构与数据库一起使用时有时会有好处。

    指向A 的非指针将始终至少具有该类型的零值。因此,即使您在那里没有任何有用的东西,它也会始终序列化为 JSON。要仅在存在填充结构时将其包含在 JSON 序列化中,请将其设为指针,可以是 nil

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多