如何解决什么时候应该在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
等类型,值
接收器非常便宜,因此除非该方法的语义要求
指针,值接收器高效且清晰。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。