WebGL+Three.js入門與實(shí)戰(zhàn) 系統(tǒng)學(xué)習(xí) Web3D 技術(shù)-塞下秋來(lái)風(fēng)景異留意
PHP 都有,Go 憑什么不支持命名參數(shù)調(diào)用函數(shù)?
WebGL+Three.js入門與實(shí)戰(zhàn) 系統(tǒng)學(xué)習(xí) Web3D 技術(shù)
download:https://www.51xuebc.com/thread-534-1-1.html
“為什么 Go 不能像 PHP、Python 一樣,在調(diào)用函數(shù)時(shí),直接帶上參數(shù)名和值一同傳入。這樣就不用特意去看這個(gè)函數(shù)的形參的命名、類型等。明明 PHP8 都支持了?”
今天針對(duì)命名參數(shù)這個(gè)特性展開(kāi)考慮,看看 Go 怎樣回事。
命名參數(shù)
假如有了命名參數(shù)這個(gè)功用特性,在我們調(diào)用函數(shù)/辦法時(shí),傳入函數(shù)的參數(shù)不需求固定位置,位置能夠隨意調(diào)整,名字對(duì)就行。以至有的工具會(huì)基于此,做自動(dòng)化的文檔等自描繪的場(chǎng)景。
PHP8 的例子:
function hello(string $name, int $age) {
echo $name, $age;
}
// 兩次調(diào)用的參數(shù)位置不一樣
hello(name:'煎魚(yú)', age:18);
hello(age:18, name:'煎魚(yú)');
理想中 Go 的例子:
package main
func sum(a int, b int) int {
return a + b
}
func main() {
resp := sum(a=7, b=28)
println(resp)
}
由于不支持,運(yùn)轉(zhuǎn)編譯就會(huì)報(bào)錯(cuò):
./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) // 輸出結(jié)果:35
}
也就是按函數(shù)所聲明的參數(shù)位置傳入,才干運(yùn)轉(zhuǎn)勝利。
設(shè)計(jì)哲學(xué)
Go 言語(yǔ)在錯(cuò)誤處置、函數(shù)重載以及缺省參數(shù)等社區(qū)議題討論時(shí),總會(huì)祭出其的設(shè)計(jì)理念是:“顯式大于隱喻”,追求明白,顯式,要不就是 “l(fā)ess is more”。
每次看到只需不滿足這個(gè)理念的提案、討論,根本 Go 團(tuán)隊(duì)能夠盤繞這個(gè)論據(jù)給出一堆理由后回絕掉。
本文提到的帶命名參數(shù)傳入函數(shù),看起來(lái)十分顯式,很明白了。似乎很契合 Go 的設(shè)計(jì)哲學(xué)理念,覺(jué)得不應(yīng)該沒(méi)有才對(duì)?
考慮
在群組的多年討論中,觸及到以下幾類論據(jù)作為支撐:
這是一個(gè)言語(yǔ)設(shè)計(jì)和可讀性問(wèn)題,“命名參數(shù)” 和 “缺省參數(shù)” 根本是成配套呈現(xiàn)在言語(yǔ)設(shè)計(jì)中,需求一并考量適宜與否。會(huì)呈現(xiàn)一加就相當(dāng)于要引入許多新語(yǔ)法特性了,能玩出騷操作。
引入這類特性會(huì)給 Go 帶來(lái)新語(yǔ)法復(fù)雜度,假如函數(shù)參數(shù)名修正了,那是不是毀壞兼容性?是不是調(diào)用方全都得改一遍?假如呈現(xiàn)同名的參數(shù)名,誰(shuí)先誰(shuí)后?怎樣掩蓋?過(guò)長(zhǎng)的話,函數(shù)調(diào)用會(huì)不會(huì)過(guò)于難承受?組合構(gòu)造體掩蓋辦法時(shí),辦法參數(shù)名需不需求堅(jiān)持分歧?會(huì)產(chǎn)生一大堆新問(wèn)題。
引入后會(huì)產(chǎn)生大量的函數(shù)可選參數(shù)(命名參數(shù)+缺省參數(shù)),本來(lái)只需求曉得函數(shù)形參是什么,結(jié)果引入后需求查看名字、缺省值以及對(duì)應(yīng)的缺省邏輯等,會(huì)加大程序員心智擔(dān)負(fù)。
編譯器自身不需求關(guān)注這些信息,為這個(gè)特性加大編譯器的各項(xiàng)開(kāi)支是不用要的,沒(méi)有理由讓編譯器在編譯代碼中存儲(chǔ)函數(shù)的參數(shù)稱號(hào)(需求詳細(xì)講究深意)。
顯然官方態(tài)度是,增加命名參數(shù)特性的弊大于利,貿(mào)然增加會(huì)影響到 Go 自身標(biāo)榜的優(yōu)勢(shì)(簡(jiǎn)約)。以為大可不用加,工具的問(wèn)題需求讓工具本人處理。
總結(jié)
在這篇文章中,我們針對(duì)其他編程言語(yǔ)既有的 “命名參數(shù)” 特性停止了剖析和闡明。顯然 Go 團(tuán)隊(duì)在討論中,以為該項(xiàng)特性關(guān)于靜態(tài)言語(yǔ),特別關(guān)于 Go 團(tuán)隊(duì)來(lái)講,似乎益處太少,加了會(huì)影響本人的作風(fēng)(less is more),還可能會(huì)影響性能,真是大可不用。
各言語(yǔ)間的功用特性比照,是個(gè)老大難的問(wèn)題。假如都一樣,那豈不是搞個(gè)大單體編程言語(yǔ)算了?這顯然是不理想的。