Go Tour说明如下:
您只能使用接收器声明一个方法,该接收器的类型与方法在同一个包中定义。您不能使用接收器声明一个方法,该接收器的类型在另一个包中定义(包括内置类型,如int)。
除了避免每个人都在int
和string
之外建立自己的方法之外,还有其他原因吗?我用Google搜索过,但找不到任何引用它的内容。
答案 0 :(得分:6)
原因是如果您可以在其他包的类型上定义方法,则可以修改其他包的行为。这是因为给定类型的方法集可能会影响该类型的值的使用方式。
例如,考虑fmt.Println
函数。将参数传递给fmt.Println
时,它将根据一组规则打印该值的字符串表示形式。其中一个规则是,如果值的类型具有String() string
方法(即,它实现了fmt.Stringer
接口),那么将调用该方法以获取该方法的字符串表示形式。值。
因此,假设我们有一个包foo
,并且该包具有类型FooInt
,定义如下:
type FooInt int
现在假设这个包还有一个函数PrintFooInt
:
func PrintFooInt(f FooInt) { fmt.Println(f) }
这将打印f
的整数值。但是,让我们说你(在另一个包中,说main
)能够向FooInt
添加方法。然后你可以这样做:
func (f FooInt) String() string { return "foobar!" }
这实际上会改变foo.PrintFooInt
的行为,这不应该从包外面进行。