问题描述
|
已经定义
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
等类型,值
接收器非常便宜,因此除非该方法的语义要求
指针,值接收器高效且清晰。