什么时候应该在Go中针对值而不是指针定义方法?

问题描述

| 已经定义
type MyInt int
我想定义一个显示值的方法“ 1”。我可以使用
*MyInt
定义它:
func (this *MyInt) ShowMe() {
    fmt.Print(*this,\"\\n\")
}
或使用
MyInt
func (this MyInt) ShowMe() {
    fmt.Print(this,\"\\n\")
}
在什么情况下,建议在值而不是指针上定义方法?     

解决方法

        做出此决定时,有两个问题要问自己: 我是否希望能够修改接收者的价值? 复制接收者的价格会很昂贵吗? 如果这些问题中的任何一个答案为是,则在指针上定义方法。 在您的示例中,您不需要修改接收方的值,并且复制接收方也不昂贵。 为了确定对第二个问题的答案,我的经验法则是:如果接收方是一个具有多个字段的结构,则按指针传递。否则按值传递。     ,        Go FAQ(获得CC许可)有一个答案:   我应该在值或指针上定义方法吗?
func (s *MyStruct) pointerMethod() { } // method on pointer
func (s MyStruct)  valueMethod()   { } // method on value
     对于不习惯使用指针的程序员,两者之间的区别   这两个例子可能会令人困惑,但实际情况是   很简单的。在类型上定义方法时,接收方(   上面的示例)的行为就好像它是   方法。将接收器定义为值还是指针是   那么,同样的问题,如函数参数是否应为   值或指针。有几个注意事项。      首先,也是最重要的是,该方法是否需要修改   接收者?如果是这样,则接收者必须是指针。 (片和   地图是参考类型,因此它们的故事有些微妙,但是   例如在接收方的方法中更改切片的长度   必须仍然是一个指针。)在上面的示例中,如果
pointerMethod
  修改s的字段,调用者将看到这些更改,但是   
valueMethod
被调用方的参数的副本(即   传递值的定义),因此它所做的更改将是   呼叫者看不见。      顺便说一下,指针接收器与Java中的情况相同,   尽管在Java中,指针隐藏在幕后;去吧   不寻常的价值接收者。      其次是对效率的考虑。如果接收器很大,   例如,大
struct
,使用指针会便宜很多   接收器。      接下来是一致性。如果某些类型的方法必须具有   指针接收器,其余的也应该如此,因此方法集为   无论使用哪种类型,都保持一致。请参阅以下部分   方法集   有关详细信息。      对于基本类型,切片和小
structs
等类型,值   接收器非常便宜,因此除非该方法的语义要求   指针,值接收器高效且清晰。