为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
回首忆惘然 2021-12-27 18:07:03
在围棋之旅说的情况如下:您只能声明具有接收器的方法,该接收器的类型定义在与该方法相同的包中。您不能使用其类型在另一个包中定义的接收器(包括内置类型,例如 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,这在包外部是不可能的。


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 278 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信