复制或传递指针

时间:2017-03-12 18:18:07

标签: 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 string) {
    foo.Body = body
}

3 个答案:

答案 0 :(得分:2)

您是否阅读了Go Frequently Asked Questions (FAQ)

  

Should I define methods on values or pointers?

func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct)  valueMethod()   { } // method on value
     

对于不习惯指针的程序员来说,区别   这两个例子可能令人困惑,但事实上情况确实如此   非常简单。在类型上定义方法时,接收器(在   上面的例子)就像它是一个参数一样   方法。是将接收器定义为值还是指针   同样的问题,那么,函数参数是否应该是a   值或指针。有几点需要考虑。

     

首先,最重要的是,该方法是否需要修改   接收器?如果是,接收器必须是指针。 (切片和地图   作为参考,所以他们的故事更微妙,但是   在接收器必须的方法中更改切片长度的实例   仍然是一个指针。)在上面的例子中,如果pointerMethod修改   在s的字段中,调用者将看到这些更改,但valueMethod是   用调用者的参数的副本调用(这是定义的   传递一个值,所以改变它使得调用者看不见。

     

顺便说一句,指针接收器与Java中的情况相同,   虽然在Java中,指针隐藏在封面下;这是Go的   价值接收器是不寻常的。

     

其次是效率的考虑。如果接收器很大,a   例如,大结构,使用指针要便宜得多   接收机。

     

接下来是一致性。如果该类型的某些方法必须具有   指针接收器,其余的也应该是,所以方法集是   无论使用何种类型,都是一致的。请参阅有关的部分   方法设置细节。

     

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

答案 1 :(得分:1)

你在哪里看到建议使用非指针接收器作为吸气剂?我不认为这是在官方包装中完成的;例如,zip package肯定会为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)

另见:

答案 2 :(得分:0)

使用struct时(如上例所示),请尽可能使用指针。我没有看到将结构作为指针传递错误,尤其是当您不修改其值时。在你不希望对你的结构进行变异的情况下,为了确保你没有修改任何东西,你不会将它作为一个值传递,但是当你执行读取时只有它更喜欢在这种情况下使用指针;)