Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go的结构字段中对非基本类型使用指针是否更好_Go - Fatal编程技术网

在Go的结构字段中对非基本类型使用指针是否更好

在Go的结构字段中对非基本类型使用指针是否更好,go,Go,我正在进行一个处理一些数据的项目,我想知道在结构的非基本类型字段中使用指针是否更好 我发现使用指针的原因是nil可以用作零值,这是使用指针的唯一原因吗 例如,我将在我的结构中存储time.time,并且它不能为零,那么使用非指针字段是否更好 那么可以使用吗 type A struct { CreatedAt time.Time } 而不是 type A struct { CreatedAt *time.Time } 现在什么时候不是零?我不确定我是否理解这个问题。在现在

我正在进行一个处理一些数据的项目,我想知道在结构的非基本类型字段中使用指针是否更好

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

例如,我将在我的结构中存储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作为字段的值。