首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WebGL+Three.js入门与实战 系统学习 Web3D 技术-塞下秋来风景异留意

PHP 都有,Go 凭什么不支持命名参数调用函数?

WebGL+Three.js入门与实战 系统学习 Web3D 技术

download:https://www.51xuebc.com/thread-534-1-1.html

“为什么 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 的设计哲学理念,觉得不应该没有才对?

考虑

在群组的多年讨论中,触及到以下几类论据作为支撑:

这是一个言语设计和可读性问题,“命名参数” 和 “缺省参数” 根本是成配套呈现在言语设计中,需求一并考量适宜与否。会呈现一加就相当于要引入许多新语法特性了,能玩出骚操作。

引入这类特性会给 Go 带来新语法复杂度,假如函数参数名修正了,那是不是毁坏兼容性?是不是调用方全都得改一遍?假如呈现同名的参数名,谁先谁后?怎样掩盖?过长的话,函数调用会不会过于难承受?组合构造体掩盖办法时,办法参数名需不需求坚持分歧?会产生一大堆新问题。

引入后会产生大量的函数可选参数(命名参数+缺省参数),本来只需求晓得函数形参是什么,结果引入后需求查看名字、缺省值以及对应的缺省逻辑等,会加大程序员心智担负。

编译器自身不需求关注这些信息,为这个特性加大编译器的各项开支是不用要的,没有理由让编译器在编译代码中存储函数的参数称号(需求详细讲究深意)。

显然官方态度是,增加命名参数特性的弊大于利,贸然增加会影响到 Go 自身标榜的优势(简约)。以为大可不用加,工具的问题需求让工具本人处理。

总结

在这篇文章中,我们针对其他编程言语既有的 “命名参数” 特性停止了剖析和阐明。显然 Go 团队在讨论中,以为该项特性关于静态言语,特别关于 Go 团队来讲,似乎益处太少,加了会影响本人的作风(less is more),还可能会影响性能,真是大可不用。

各言语间的功用特性比照,是个老大难的问题。假如都一样,那岂不是搞个大单体编程言语算了?这显然是不理想的。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230220A03DLA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券