在Go中的struct字段中使用非基本类型的指针是否更好?

时间:2018-04-14 16:15:18

标签: go

我正在进行一个处理一些数据的项目,我想知道如果在结构的非原始类型字段中使用指针更好。

我发现使用指针的原因是nil可以用作零值,这是使用指针的唯一原因吗?

例如,我将time.Time存储在我的结构中,它不能是nil,那么使用非指针字段会更好吗?

所以可以使用

type A struct {
   CreatedAt   time.Time
}

而不是

type A struct {
    CreatedAt   *time.Time
}

Now不是nil时?

2 个答案:

答案 0 :(得分:0)

不确定我理解这个问题。在"现在"我会把它作为结构的函数,即:

type A struct{}

func (a A) Now() time.Time { return time.Now(); }

否则Now是什么意思?现在正在不断变化。

when to use pointers

上有很棒的博客

如果值可以是nil,那么它并不真正依赖于它,而是更多地依赖于内存和并发性。指针将作为引用传递,因此内存更少,速度更快,但也意味着改变一次性例程可能非常危险,因为该值可能会在另一个例程中被引用并导致竞争条件和意外行为。

答案 1 :(得分:-4)

我不是真正的专业人士或者知道Go的来龙去脉,所以我带着一些盐就说出来。

但是我理解它,你应该最有可能使用指针。

这是因为每次使用非指针类型时,整个结构都将成为内存中结构的一部分。因此,您不能在多个结构之间共享结构的单个实例 - 每个结构都会获得原始结构的副本。

下面是一个小例子:

// This struct has 2x64 bits in size
type MyStruct struct {
    A uint64
    B uint64
}

// This struct has 32 + 2x64 bits in size
type MyOtherStruct struct {
    C uint32
    Parent MyStruct
}

// This struct has 32 + the length of an address bits size 
type MyPointerStruct struct {
    D uint32
    Parent *MyStruct
}

但是除了内存问题之外,如果你的内部结构非常大,那么性能也会受到影响。因为每次设置内部结构时,必须将整个内存复制到您的实例。

然而如果您正在处理接口结构,则必须小心。在运行时,接口表示为具有两个字段的类型:对实际(运行时)类型的引用和对引用的引用实际的实例。

所以我 - 我不专业的意见 - 建议使用指针,如果你有接口类型,因为否则CPU必须两次(一次获得接口引用,然后再次获取)接口的实例)。