婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法(譯)

Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法(譯)

熱門標(biāo)簽:黃岡人工智能電銷機(jī)器人哪個(gè)好 濱州自動(dòng)電銷機(jī)器人排名 釘釘有地圖標(biāo)注功能嗎 鄭州亮點(diǎn)科技用的什么外呼系統(tǒng) 阿里云ai電話機(jī)器人 惠州電銷防封電話卡 汕頭小型外呼系統(tǒng) 浙江高頻外呼系統(tǒng)多少錢一個(gè)月 建造者2地圖標(biāo)注

前言

學(xué)習(xí)一門新的語(yǔ)言肯定是要從他的基本語(yǔ)法開始,語(yǔ)法構(gòu)成了整個(gè)程序設(shè)計(jì)的基礎(chǔ),從語(yǔ)法中我們也可以看到這門語(yǔ)言的一些特性,但是話說回來,語(yǔ)法這東西,不同的語(yǔ)言大同小異,所以這也對(duì)語(yǔ)法的記憶造成了一定的難度,其實(shí)最好的方法應(yīng)該是旁邊有本書,隨時(shí)可以拿過來查閱或者糾正。

Go 的初學(xué)者可能會(huì)有這樣的疑問:為什么 Go 的聲明語(yǔ)法與傳統(tǒng)的其他 C 家族編程語(yǔ)言不太一樣?在這篇文章中我們會(huì)比較這兩種不同的方式,并且也會(huì)解釋為什么。下面話不多說了,來一起看看詳細(xì)的介紹吧。

C 變量

首先,讓我們說說 C 中的語(yǔ)法。C 使用了一種不尋常的巧妙的方法來實(shí)現(xiàn)聲明語(yǔ)法。我們不是用什么特殊的語(yǔ)法來描述類型,而是寫一個(gè)表達(dá)式,這個(gè)表達(dá)式包含兩個(gè)部分:被聲明的變量和變量的類型。

int x;

上面這行代碼聲明了一個(gè)類型為 int 的變量 x。一般來說,為了弄清楚如何編寫新變量的類型,可以先寫一個(gè)含基本類型變量的表達(dá)式,然后將基本類型放在左邊,將表達(dá)式放在右邊。

因此,下面的聲明:

int *p;
int a[3];

描述的是 p 是一個(gè)指向 int 類型的指針,因?yàn)?‘*p' 的類型為 int。而 a 是一個(gè) int 類型的數(shù)組,因?yàn)?‘a(chǎn)[3]' (這里請(qǐng)忽略下標(biāo)的值 3,它只是說明數(shù)組的大小)的類型是 int。

那函數(shù)呢?在最開始的時(shí)候,C 的函數(shù)聲明是將 參數(shù)的類型寫在括號(hào)外面的,像這樣:

int main(argc, argv)
 int argc;
 char *argv[];
{ /* ... */ }

再一次,我們可以看到 main 是一個(gè)函數(shù),因?yàn)楸磉_(dá)式 main(argc, argv) 返回了一個(gè) int 類型的值。現(xiàn)在大家比較習(xí)慣寫成這樣:

int main(int argc, char *argv[]) { /* ... */ }

但是基本的結(jié)構(gòu)還是一樣的。

對(duì)于簡(jiǎn)單的類型來說這種巧妙的語(yǔ)法思想是能很好工作的,但是一旦類型變得復(fù)雜就會(huì)令人感到困惑了。非常經(jīng)典的一個(gè)例子就是聲明一個(gè)函數(shù)指針。遵循著規(guī)則,你得到了下面的這種寫法:

int (*fp)(int a, int b);

fp 是一個(gè)指向函數(shù)的指針,因?yàn)槿绻銓懸粋€(gè)表達(dá)式 (*fp)(a, b) 你會(huì)調(diào)用函數(shù)并得到一個(gè) int 類型的值。那如果 fp 的其中一個(gè)入?yún)⑺旧硪彩且粋€(gè)函數(shù)呢?

int (*fp)(int (*ff)(int x, int y), int b)

這就變得開始難以閱讀了。

當(dāng)然,我們可以在聲明一個(gè)函數(shù)的時(shí)候去掉參數(shù)名,那么 main 函數(shù)可以聲明成:

int main(int, char *[])

讓我們回想一下,argv 是這樣聲明的,

char *agrv[]

通過把變量名放在中間來聲明類似 char *[] 這樣類型的時(shí)候其實(shí)是令人困惑的。

然后我們?cè)賮砜纯慈绻覀儗⑷雲(yún)⒆兞棵サ舻那闆r下 fp 函數(shù)的聲明是怎么樣的:

int (*fp)(int (*)(int, int), int)

無論將變量名放在內(nèi)部的哪里都不那么清晰明了。對(duì)于第一個(gè)入?yún)ⅲ?/p>

int (*)(int, int)

我想這不太容易能一眼看出是在聲明一個(gè)指向函數(shù)的指針。再進(jìn)一步,如果我們的返回值也是一個(gè)函數(shù)指針呢?

int (*(*fp)(int (*)(int, int), int))(int, int)

這根本就看不清聲明出來的 fp 到底是個(gè)啥玩意。。。

你自己也可以構(gòu)造出更多這類詳細(xì)的例子,但是這些都說明了 C 的聲明語(yǔ)法可能引入的一些困難。

不過還有一點(diǎn)需要提出。因?yàn)轭愋秃吐暶鞯恼Z(yǔ)法是相同的,所以解析中間類型的表達(dá)式是很困難的。這就是為什么 C 的類型轉(zhuǎn)換總是用括號(hào)括起來:

(int)M_PI

Go 語(yǔ)法

非 C 家族的編程語(yǔ)言通常使用不同的聲明類型的語(yǔ)法:變量名通常放在前面,然后緊跟著一個(gè)冒號(hào)。因此我們上面的例子就變成了這樣:

x: int
p: pointer to int
a: array[3] of int

這些聲明是明確的,如果從左往右讀你會(huì)發(fā)現(xiàn)也是詳細(xì)的。Go 語(yǔ)言從中得到了啟發(fā),但為了簡(jiǎn)潔起見,刪除了冒號(hào)和一些關(guān)鍵字:

x int
p *int
a [3]int

這個(gè)例子中 [3]int 與如何在表達(dá)式中使用 a 這兩者似乎沒有直接的對(duì)應(yīng)。(后面一小節(jié)中我們會(huì)講到指針的。)你可以通過單獨(dú)的語(yǔ)法來獲得清晰的結(jié)果。

現(xiàn)在讓我們考慮下函數(shù)。讓我們把這個(gè)聲明寫成 Go 的形式,盡管在 Go 中真正的 main 函數(shù)是沒有入?yún)⒌模?/p>

func main(argc int, argv []string) int

表面上這和 C 語(yǔ)言并沒什么不同,除了將字符數(shù)組改成了字符串形式。但是從左往右讀起來卻很順暢:

函數(shù) main 需要傳入一個(gè)整型和字符串切片并且返回一個(gè)整型。(譯者注:直到譯者看到這篇文章,譯者才發(fā)現(xiàn)原來這么寫讀起來竟這么順暢。。。)

即便舍去變量名還是很明確——因?yàn)閷?duì)于類型聲明上沒有位置的變化,所以也沒有什么困惑。

func main(int, []string) int

這種從左到右的風(fēng)格有一個(gè)優(yōu)點(diǎn):就算類型變得越來越復(fù)雜,這種方式還是表現(xiàn)得很得當(dāng)。

舉個(gè)聲明函數(shù)變量的例子(類似在 C 語(yǔ)言中的函數(shù)指針):

f func(func(int, int) int, int) int

或者如果 f 返回的也是一個(gè)函數(shù)(譯者注:邊寫邊讀你會(huì)再次驚訝于這絲滑般的順暢感。。。):

f func(func(int, int) int, int) func(int, int) int

從左到右依然讀起來很順暢,并且當(dāng)變量名被聲明的時(shí)候也很明顯。

類型和表達(dá)式的語(yǔ)法的不同點(diǎn)使得在 Go 中編寫和調(diào)用閉包是那么的簡(jiǎn)單:

sum := func(a, b int) int { return a + b } (3, 4)

指針

指針這家伙總是表現(xiàn)得“與眾不同”一點(diǎn)。觀察下數(shù)組和切片,舉個(gè)例子,Go 的類型語(yǔ)法將方括號(hào)放在類型的左邊,但是賦值表達(dá)式語(yǔ)法卻是將其放在表達(dá)式的右邊:

var a []int
x = a[1]

為了讓大家有一種熟悉的感覺,Go 的指針同樣延續(xù) C 語(yǔ)言中的 * 符號(hào),但是我們不能簡(jiǎn)單的將指針類型也反轉(zhuǎn)一下。所以指針使用方式如下:

var p *int
x = *p

我們不能簡(jiǎn)單粗暴地改成這樣:

var p *int
x = p*

因?yàn)楹缶Y 會(huì)與乘法的 相混淆。那或許我們可以使用 ^,舉個(gè)例子:

var p ^int
x = p^

但同樣的這個(gè)符號(hào)也已經(jīng)有其他含義了,類型和表達(dá)式在前綴后綴的問題上總是在許多方面使事情復(fù)雜化。舉個(gè)例子,

[]int("hi")

這是一種寫法,但一旦以 * 打頭就必須用括號(hào)將其包住:

(*int)(nil)

如果我們?cè)敢夥艞?* 作為指針語(yǔ)法,那么這些括號(hào)就不是必要的了。(譯者注:但還能有更好的指針語(yǔ)法嗎。。。)

所以 Go 的指針語(yǔ)法與熟悉的 C 語(yǔ)言是類似的,但這個(gè)關(guān)聯(lián)也意味著我們不得不使用括號(hào)來消除語(yǔ)法中的類型和表達(dá)式之間的差異。

總體而言,我們相信 Go 的類型語(yǔ)法比 C 的要更容易理解,尤其是當(dāng)事情變得復(fù)雜的時(shí)候。

關(guān)于Go語(yǔ)言為何要采用這種倒序語(yǔ)法呢?

Go的設(shè)計(jì)者Rob Pike的一篇介紹Go聲明語(yǔ)法的文章給出了答案,其中談到了Go聲明語(yǔ)法的設(shè)計(jì)考量。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • Go語(yǔ)言中的Slice學(xué)習(xí)總結(jié)
  • GO 語(yǔ)言學(xué)習(xí)指南
  • Go語(yǔ)言學(xué)習(xí)筆記之反射用法詳解
  • Go語(yǔ)言基礎(chǔ)學(xué)習(xí)教程
  • Go語(yǔ)言函數(shù)學(xué)習(xí)教程
  • golang新手不注意可能會(huì)出現(xiàn)的一些小問題

標(biāo)簽:昭通 瀘州 泰安 晉中 駐馬店 阿壩 東營(yíng) 滄州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法(譯)》,本文關(guān)鍵詞  語(yǔ)言,學(xué)習(xí)教程,之,聲明,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法(譯)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Go語(yǔ)言學(xué)習(xí)教程之聲明語(yǔ)法(譯)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 龙门县| 彰化县| 全州县| 昌图县| 米林县| 新蔡县| 黑龙江省| 昆山市| 军事| 绥滨县| 钟山县| 桃江县| 垫江县| 榆社县| 谷城县| 尼勒克县| 隆昌县| 疏附县| 三穗县| 宣汉县| 剑川县| 抚顺市| 达日县| 全南县| 正定县| 彭州市| 吴堡县| 平凉市| 东宁县| 满洲里市| 新丰县| 公主岭市| 康马县| 宁武县| 筠连县| 南溪县| 梁河县| 锡林郭勒盟| 乌拉特后旗| 巨鹿县| 长岭县|