在Go的结构字段中对非基本类型使用指针是否更好
我正在进行一个处理一些数据的项目,我想知道在结构的非基本类型字段中使用指针是否更好 我发现使用指针的原因是nil可以用作零值,这是使用指针的唯一原因吗 例如,我将在我的结构中存储time.time,并且它不能为零,那么使用非指针字段是否更好 那么可以使用吗在Go的结构字段中对非基本类型使用指针是否更好,go,Go,我正在进行一个处理一些数据的项目,我想知道在结构的非基本类型字段中使用指针是否更好 我发现使用指针的原因是nil可以用作零值,这是使用指针的唯一原因吗 例如,我将在我的结构中存储time.time,并且它不能为零,那么使用非指针字段是否更好 那么可以使用吗 type A struct { CreatedAt time.Time } 而不是 type A struct { CreatedAt *time.Time } 现在什么时候不是零?我不确定我是否理解这个问题。在现在
type A struct {
CreatedAt time.Time
}
而不是
type A struct {
CreatedAt *time.Time
}
现在什么时候不是零?我不确定我是否理解这个问题。在现在的情况下,我将使其成为结构的一个函数,即:
type A struct{}
func (a A) Now() time.Time { return time.Now(); }
否则,现在意味着什么?现在是不断变化的
网上有很多很棒的博客
简短的是,它实际上并不取决于值是否可以为零,而是取决于内存和并发性。指针将作为引用传递,因此内存更少,速度更快,但也意味着在一个围棋程序中更改可能非常危险,因为该值可能会在另一个围棋程序中被引用,并导致比赛条件和意外行为。我不是真正的专业人士,也不知道围棋的细节,所以,对我说的每一句话都要有保留 但据我所知,您最有可能使用指针 这是因为每次使用非指针类型时,整个结构都将是内存中结构的一部分。因此,您不能在多个结构之间共享一个结构实例-每个结构实例都会获得原始结构的副本 下面是一个小例子:
// 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必须遵循两次,一次获取接口引用,然后再次获取接口实例。啊,我认为我选择了错误的示例。我在帖子中更改了字段名。这只是一个简单的例子,实际上struct的值没有改变。在发布问题之前,我读过一些文章,但我找不到“何时在结构域中使用指针”这篇文章。还有一个问题:我见过一个项目,它使用指向非基本类型的指针作为结构域,比如go telegram bot api。使用这样的指针是常见的做法吗?如果我不必在多个结构上共享一个值,那么使用非指针是否可以?是的,为什么不可以:nil指针和零值彼此无关。我的意思是,当它是指针时,我可以使用nil作为字段的值。