我正在进行一个处理一些数据的项目,我想知道如果在结构的非原始类型字段中使用指针更好。
我发现使用指针的原因是nil
可以用作零值,这是使用指针的唯一原因吗?
例如,我将time.Time
存储在我的结构中,它不能是nil
,那么使用非指针字段会更好吗?
所以可以使用
type A struct {
CreatedAt time.Time
}
而不是
type A struct {
CreatedAt *time.Time
}
当Now
不是nil
时?
答案 0 :(得分:0)
不确定我理解这个问题。在"现在"我会把它作为结构的函数,即:
type A struct{}
func (a A) Now() time.Time { return time.Now(); }
否则Now
是什么意思?现在正在不断变化。
如果值可以是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必须两次(一次获得接口引用,然后再次获取)接口的实例)。