繁体   English   中英

为什么 Golang 允许两个具有不同接收者类型的函数具有相同的名称,但如果它们具有不同的参数类型则不允许?

[英]Why does Golang allow two functions to have the same name if they have different receiver types but not if they have different parameter types?

为什么 Golang 允许两个具有不同接收者类型的函数具有相同的名称,但如果它们具有不同的参数类型则不允许? 考虑例如

type A struct{}
type B struct{}

// This is allowed
func (*A) foo(){}
func (*B) foo(){}

// This is not allowed
func foo(*A){}
func foo(*B){} // compilation error: "foo redeclared in this block"

这个选择背后的逻辑是什么?

Go 常见问题解答:为什么 Go 不支持方法和运算符的重载?

如果方法分派也不需要进行类型匹配,则它会得到简化。 使用其他语言的经验告诉我们,具有相同名称但不同签名的各种方法偶尔有用,但在实践中也可能令人困惑和脆弱。 仅按名称匹配并要求类型一致是 Go 类型系统中的一个主要简化决策。

关于运算符重载,它似乎比绝对要求更方便。 同样,没有它,事情会更简单。

允许具有相同名称的不同类型的方法(具有可选的相同参数类型,在同一包中声明)是允许的,原因很明显:将方法绑定到一个类型自然地为该方法提供了一个“名称空间”,即它们所属的类型。

如果不允许,则不能在实现相同接口的相同 package 中声明多个类型。 这将需要将它们放入不同的包中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM