Go如何优雅的解决方法的重载

Go如何优雅的解决方法的重载1 问题你是否曾经见过这样的代码 func Handler func Handler timeOut time Duration func Handler timeOut time

欢迎大家来到IT世界,在知识的湖畔探索吧!

1、问题

你是否曾经见过这样的代码

func Handler() { //... } func Handler(timeOut time.Duration) { //.. } func Handler(timeOut time.Duration, retry int) { //.. }

欢迎大家来到IT世界,在知识的湖畔探索吧!

我就是想要处理,超时和重试哇,但是有些可以是默认值哇。怎么办,写三个方法吗,然后方法名字不同,三个方法名字,这种做法正确吗?显然是不合理的。如何解决呢。这就是go的缺点,缺点就是方法的重载。

2、解决问题

其实解决的思想很简单,我们知道有可变参数,那么到底传入什么样的参数哇。

难道是这样子?

欢迎大家来到IT世界,在知识的湖畔探索吧!func Handler(op ...interface{}) { }

哇,太不合理了吧,如何解析呢。

哇,是不是能不能这样子。

type Op struct { TimeOut time.Duration Retry int } func Handler(op *Op) { }

但是人家不想传入参数咋整。。。 这个解决不了。换种思维,其实很多框架都使用了这种方式。

欢迎大家来到IT世界,在知识的湖畔探索吧!type Option func(*Options) type Options struct { TimeOut time.Duration RetryMaxNum int } func loadOp(option ...Option) *Options { options := new(Options) for _, e := range option { e(options) } return options } // 最终这样子 func Handler(option ...Option) { op := loadOp(option ...) }

然后我们就可以愉快地使用了。

func main() { Handler() Handler(func(options *Options) { options.TimeOut = time.Millisecond }) Handler(func(options *Options) { options.RetryMaxNum = 1 }) Handler(func(options *Options) { options.RetryMaxNum = 1 }, func(options *Options) { options.TimeOut = time.Millisecond }) }

是不是问题就解决了,确实这就是编程设计的魅力,哈哈哈哈。

总结

Go语言追求精简,同时很多面向对象的特性都没有,开发中缺失面向对象是不可能的,所以只有不断的挖掘新的思想才可以。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/143983.html

(0)
上一篇 33分钟前
下一篇 18分钟前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信