当我有一个包含其他结构的结构时,我应该总是使用指针吗?

时间:2014-04-26 09:33:34

标签: go

我们有:

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的指针,并且在传递Second A时永远不会复制*B的值。或者我错过了什么?

2 个答案:

答案 0 :(得分:5)

没有一个正确的答案。它总是取决于你的用例。

一些指导:

  1. 在效率考虑因素之上处理语义原因
  2. A为"大"
  3. 时使用指针
  4. 在不允许B编辑A
  5. 时避免使用指针

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

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

答案 1 :(得分:0)

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

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