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
Pointers 复制或传递指针_Pointers_Go_Getter Setter - Fatal编程技术网

Pointers 复制或传递指针

Pointers 复制或传递指针,pointers,go,getter-setter,Pointers,Go,Getter Setter,我看到了在getter和setter中使用以下内容的建议,即在设置值以更改原始数据时传递指针,但在获取值时不需要这样做 对于没有指针的getter,将复制该值。我的问题是,复制对象以从中获取值不是效率低下吗?我们可以不使用指针吗 type Foo struct { Body string } func (foo Foo) GetBody() interface{} { return foo.Body } func (foo * Foo) SetBody(body strin

我看到了在getter和setter中使用以下内容的建议,即在设置值以更改原始数据时传递指针,但在获取值时不需要这样做

对于没有指针的getter,将复制该值。我的问题是,复制对象以从中获取值不是效率低下吗?我们可以不使用指针吗

type Foo struct {
     Body string
}

func (foo Foo) GetBody() interface{} {
    return foo.Body
}

func (foo * Foo) SetBody(body string) {
    foo.Body = body
}

您在哪里看到使用非指针接收器作为getter的建议?我不认为这是做在正式的一揽子计划;e、 例如,对于getter和setter,都使用指针接收器

func (h *FileHeader) ModTime() time.Time
func (h *FileHeader) Mode() (mode os.FileMode)
func (h *FileHeader) SetModTime(t time.Time)
func (h *FileHeader) SetMode(mode os.FileMode)
另见:


当像上面的例子一样使用struct时,尽可能使用指针。我不认为将结构作为指针传递有任何错误,尤其是在不修改其值的情况下。有些情况下,当你不想在你的结构上做变异,所以为了确保你没有修改任何东西,你不会把它作为一个值来传递,但是在执行只读时,在这种情况下更倾向于使用指针

你读了那本书了吗

对于不习惯使用指针的程序员来说 这两个例子可能会让人困惑,但实际情况却是如此 很简单。在类型上定义方法时,接收方在 上面的示例的行为就像它是 方法是否将接收器定义为值或指针是不确定的 同样的问题,比如函数参数是否应该是 值或指针。有几个考虑因素

首先,也是最重要的,该方法是否需要修改 接受者如果是,则接收器必须是指针。切片和贴图 作为参考,这样他们的故事就更微妙了,但是 实例来更改接收方必须执行的方法中切片的长度 仍然是一个指针。在上面的示例中,如果pointerMethod修改 s的字段,调用方将看到这些更改,但valueMethod是 使用调用方参数的副本调用,该参数是 传递一个值,使其所做的更改对调用方不可见

顺便说一下,指针接收器与Java中的情况相同, 尽管在Java中,指针隐藏在盖子下面;它是去的 不寻常的价值接受者

二是效率的考虑。如果接收器较大,则为 例如,使用指针会便宜得多 接受者

其次是一致性。如果该类型的某些方法必须具有 指针接收器,其余的也应该是,因此方法集是 无论类型如何使用,都是一致的。请参阅上的一节 方法集以获取详细信息

对于基本类型、切片和小型结构等类型,值 接收方非常便宜,所以除非方法的语义需要 一个指针,一个值接收器是高效和清晰的


因此,我想最好在获取和设置时都使用指针类型,以便高效和一致,您同意吗?访问非指针值,从而创建副本,使并发访问更安全。例如,通道。另外,仅供参考,Golang约定不使用Get作为getter的前缀。就叫它Foo.Body和Foo.SetBody。使用metalinter设置go环境,这将为您提供更好的约定。@eduncan911好的,那么这是一个深度副本吗?假设foo有一个数组字段,会被复制吗?@eduncan911关于约定我同意,但这里有一个两难的问题,我不记得了,在某个非官方的地方,但是谢谢你发布这个,现在我可以使用它了。
func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct)  valueMethod()   { } // method on value