在围棋之旅说的情况如下:您只能声明具有接收器的方法,该接收器的类型定义在与该方法相同的包中。您不能使用其类型在另一个包中定义的接收器(包括内置类型,例如 int)来声明方法。除了避免每个人都建立自己的方法之外int,还有其他原因string吗?我已经谷歌搜索,但找不到任何引用它的内容。
1 回答
MM们
TA贡献1886条经验 获得超2个赞
原因是如果你可以在其他包的类型上定义方法,你就可以修改其他包的行为。这是因为给定类型的方法集会影响该类型值的使用方式。
例如,考虑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
,这在包外部是不可能的。
- 1 回答
- 0 关注
- 278 浏览
添加回答
举报
0/150
提交
取消