为什么Go中的方法只能在同一个包中定义的类型上声明?

时间:2016-03-29 19:40:31

标签: methods go

Go Tour说明如下:

  

您只能使用接收器声明一个方法,该接收器的类型与方法在同一个包中定义。您不能使用接收器声明一个方法,该接收器的类型在另一个包中定义(包括内置类型,如int)。

除了避免每个人都在intstring之外建立自己的方法之外,还有其他原因吗?我用Google搜索过,但找不到任何引用它的内容。

1 个答案:

答案 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的行为,这不应该从包外面进行。