gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:55:46 26 4
gpt4 key购买 nike

Go Tour说如下:

You can only declare a method with a receiver whose type is defined in the same package as the method. You cannot declare a method with a receiver whose type is defined in another package (which includes the built-in types such as int).

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

最佳答案

原因是如果您可以在其他包的类型上定义方法,您就可以修改其他包的行为。这是因为给定类型的方法集会影响该类型的值的使用方式。

例如,考虑 fmt.Println 函数。当您将参数传递给 fmt.Println 时,它将根据一组规则打印该值的字符串表示形式。其中一条规则是,如果值的类型具有 String() string 方法(即它实现了 fmt.Stringer 接口(interface)),那么将调用该方法以获得值的字符串表示形式。

因此,假设我们有一个包 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 的行为,这在包外是不可能的。

关于methods - 为什么 Go 中的方法只能声明在同一个包中定义的类型上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36293654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com