为什么Go语言不支持重载?

Golang官方文档FAQ截图
上图是Golang官网FAQ的部分截图,看来关于Go不支持重载的这个问题困扰了很多从面向对象语言转到Go的开发者。官方在这里做出了解答。
在上面的回答中有这样一句话:

Experience with other languages told us that having a variety of methods with the same name but different signatures was occasionally useful but that it could also be confusing and fragile in practice.

其意思是:使用其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。
接下来又说:在Go的类型系统中,仅按名称进行匹配并要求类型一致是一个简化的主要决定。
最后一句话:关于操作员重载,似乎比绝对要求更方便。 同样,没有它,事情会变得更简单。
整个的解答非常漂亮、简洁。我们看完之后就会理解,Go语言的设计者之所以没有在Go中实现方法的重载,并没有复杂的理由,核心原则就是:让Go保持足够的简单。 这也能看出来Go语言的设计者有着极大的选择和克制。

其实,笔者认为重载在本质上并没有很大的实际意义。只是表现力和表现形式上有一定的差别。明确某个上下文中的函数调用的关键就是函数签名,支持重载的语言中一般是函数名加函数参数构成函数签名。而Go中可以认为函数名就是签名。逻辑上没有太大的区别,就是把工作做在了台前 还是幕后的区别。

当然如果非要较真的话,我们或许可以在Go中声明方法的时候将参数写成interface{} 或者 ... 切片的方式。在传进来参数的时候做一步校验,判断参数的类型和个数,然后分别处理之。

仁者见仁智者见智,大家有什么不同的理解欢迎一起沟通。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言中,方法重载是不被直接支持的。Go语言的设计哲学是保持简洁和清晰,因此没有引入方法重载的概念。在Go语言中,方法的名称必须是唯一的,不能有相同名称但参数不同的方法。 然而,我们可以通过其他方式来实现类似方法重载的功能。一种常见的方法是使用不同的方法名称来表示不同的功能,而不是依赖于参数的类型或数量。这样可以避免混淆和歧义。 另一种方法是使用接口来实现类似的功能。通过定义不同的接口和实现它们的结构体,可以实现不同的方法行为。这样可以根据需要选择不同的接口来调用相应的方法。 下面是一个示例,演示了如何使用接口来实现类似方法重载的功能: ```go package main import "fmt" type Shape interface { Area() float64 } type Rectangle struct { Width float64 Height float64 } type Circle struct { Radius float64 } func (r Rectangle) Area() float64 { return r.Width * r.Height } func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius } func main() { rect := Rectangle{Width: 5, Height: 3} circle := Circle{Radius: 2} fmt.Println("Rectangle area:", rect.Area()) // 输出:Rectangle area: 15 fmt.Println("Circle area:", circle.Area()) // 输出:Circle area: 12.56 } ``` 在上面的示例中,我们定义了一个`Shape`接口,它包含一个`Area`方法。然后,我们定义了`Rectangle`和`Circle`结构体,并分别实现了`Area`方法。通过使用接口类型的变量,我们可以根据需要选择不同的实现来调用相应的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值