关于后端:PHP-都有Go-凭什么不支持命名参数调用函数

3次阅读

共计 1832 个字符,预计需要花费 5 分钟才能阅读完成。

大家好,我是煎鱼。

之前在《Go 语言设计哲学》电子书中分享了《为什么 Go 不反对函数重载和缺省参数?》的思考和起因。最近有一位从其余编程语言转型 Go 的同学提出了如下灵魂拷问。

“为什么 Go 不能像 PHP、Python 一样,在调用函数时,间接带上参数名和值一起传入。这样就不必特意去看这个函数的形参的命名、类型等。明明 PHP8 都反对了?”

明天针对命名参数这个个性开展思考,看看 Go 怎么回事。

命名参数

如果有了命名参数这个性能个性,在咱们调用函数 / 办法时,传入函数的参数不须要固定地位,地位能够随便调整,名字对就行。甚至有的工具会基于此,做自动化的文档等自描述的场景。

PHP8 的例子:

function hello(string $name, int $age) {echo $name, $age;}

// 两次调用的参数地位不一样
hello(name:'煎鱼', age:18);
hello(age:18, name:'煎鱼');

现实中 Go 的例子:

package main

func sum(a int, b int) int {return a + b}

func main() {resp := sum(a=7, b=28)
    println(resp)
}

因为不反对,运行编译就会报错:

./prog.go:8:15: syntax error: unexpected = in argument list; possibly missing comma or )

Go 必须是如下代码:

func sum(a int, b int) int {return a + b}

func main() {resp := sum(7, 28)
    println(resp)    // 输入后果:35
}

也就是按函数所申明的参数地位传入,能力运行胜利。

设计哲学

Go 语言在错误处理、函数重载以及缺省参数等社区议题探讨时,总会祭出其的 设计理念是:“显式大于隐喻”,谋求明确,显式,要不就是“less is more”。

每次看到只有不满足这个理念的提案、探讨,根本 Go 团队能够围绕这个论据给出一堆理由后回绝掉。

本文提到的带命名参数传入函数,看起来十分显式,很明确了。仿佛很合乎 Go 的设计哲学理念,感觉不应该没有才对?

社区思考

在 golang-nuts 邮件群组的多年探讨中,波及到以下几类论据作为撑持:

  • 这是一个 语言设计和可读性问题,“命名参数”和“缺省参数”根本是成配套呈现在语言设计中,须要一并考量适合与否。会呈现一加就相当于要引入许多新语法个性了,能玩出骚操作。
  • 引入这类个性会给 Go 带来新语法复杂度,如果函数参数名批改了,那是不是毁坏兼容性?是不是调用方全都得改一遍?如果呈现同名的参数名,谁先谁后?怎么笼罩?过长的话,函数调用会不会过于难承受?组合构造体笼罩办法时,办法参数名需不需要保持一致?会产生一大堆新问题。
  • 引入后会 产生大量的函数可选参数(命名参数 + 缺省参数),本来只须要晓得函数形参是什么,后果引入后须要查看名字、缺省值以及对应的缺省逻辑等,会加大程序员心智累赘。
  • 编译器自身不须要关注这些信息,为这个个性加大编译器的各项开销是不必要的,没有理由让编译器在编译代码中存储函数的参数名称(须要具体讲究深意)。

咱们在探讨中也有提到,这个个性能够借助 go:generate 的个性来实现相似的性能,有趣味的敌人能够看看 go-named-params 这个开源库。

显然官网态度是,减少命名参数个性的弊大于利,贸然减少会影响到 Go 自身标榜的劣势(简洁)。认为大可不必加,工具的问题须要让工具本人解决。

总结

在这篇文章中,咱们针对其余编程语言既有的“命名参数”个性进行了剖析和阐明。显然 Go 团队在探讨中,认为该项个性对于动态语言,尤其对于 Go 团队来讲,仿佛益处太少,加了会影响本人的格调(less is more),还可能会影响性能,真是大可不必。

各语言间的性能个性比照,是个老大难的问题。如果都一样,那岂不是搞个大单体编程语言算了?这显然是不事实的。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

Go 图书系列

  • Go 语言入门系列:初探 Go 我的项目实战
  • Go 语言编程之旅:深刻用 Go 做我的项目
  • Go 语言设计哲学:理解 Go 的为什么和设计思考
  • Go 语言进阶之旅:进一步深刻 Go 源码

举荐浏览

  • 醒醒吧,将来不会有 Go2 了!
  • Go1.20 那些事:PGO、编译速度、错误处理等新个性,你晓得多少?
  • 向 Swift 学习?Go 思考简略字符串插值个性
正文完
 0