![](/img/trans.png)
[英]How can two similar functions have different polymorphic types in Haskell?
[英]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.