PHP vs Go,为什么 Go 不支持命名参数调用函数?

大家好,我是煎鱼。,之前在《Go 语言设计哲学[1]》电子书中分享了《​​为什么 Go 不支持函数重载和缺省参数?​​》的思考和原因。最近有一位从其他编程语言转型 Go 的同学提出了如下灵魂拷问。,“为什么 Go 不能像 PHP、Python 一样,在调用函数时,直接带上参数名和值一起传入。这样就不用特意去看这个函数的形参的命名、类型等。明明 PHP8 都支持了?”,今天针对命名参数这个特性展开思考,看看 Go 怎么回事。,如果有了命名参数这个功能特性,在我们调用函数/方法时,传入函数的参数不需要固定位置,位置可以随意调整,名字对就行。甚至有的工具会基于此,做自动化的文档等自描述的场景。,PHP8 的例子:,理想中 Go 的例子:,由于不支持,运行编译就会报错:,Go 必须是如下代码:,也就是按函数所声明的参数位置传入,才能运行成功。,Go 语言在错误处理、函数重载以及缺省参数等社区议题讨论时,总会祭出其的设计理念是:“显式大于隐喻”,追求明确,显式,要不就是 “less is more”。,每次看到只要不满足这个理念的提案、讨论,基本 Go 团队可以围绕这个论据给出一堆理由后拒绝掉。,本文提到的带命名参数传入函数,看起来非常显式,很明确了。似乎很符合 Go 的设计哲学理念,感觉不应该没有才对?,在 golang-nuts 邮件群组的多年讨论中,涉及到以下几类论据作为支撑:,我们在讨论中也有提到,这个特性可以借助 go:generate 的特性来实现类似的功能,有兴趣的朋友可以看看 go-named-params[2] 这个开源库。,显然官方态度是,增加命名参数特性的弊大于利,贸然增加会影响到 Go 本身标榜的优势(简洁)。认为大可不必加,工具的问题需要让工具自己解决。,在这篇文章中,我们针对其他编程语言既有的 “命名参数” 特性进行了分析和说明。显然 Go 团队在讨论中,认为该项特性对于静态语言,尤其对于 Go 团队来讲,似乎好处太少,加了会影响自己的风格(less is more),还可能会影响性能,真是大可不必。,各语言间的功能特性对比,是个老大难的问题。如果都一样,那岂不是搞个大单体编程语言算了?这显然是不现实的。,[1]Go 语言设计哲学: https://golang3.eddycjy.com/,[2]go-named-params: https://github.com/elliotchance/go-named-params

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/22071.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34