亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言學習教程之聲明語法(譯)

2020-04-01 19:01:14
字體:
來源:轉載
供稿:網友

前言

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

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

C 變量

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

int x;

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

因此,下面的聲明:

int *p;int a[3];

描述的是 p 是一個指向 int 類型的指針,因為 ‘*p' 的類型為 int。而 a 是一個 int 類型的數組,因為 ‘a[3]' (這里請忽略下標的值 3,它只是說明數組的大?。┑念愋褪?int。

那函數呢?在最開始的時候,C 的函數聲明是將 參數的類型寫在括號外面的,像這樣:

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

再一次,我們可以看到 main 是一個函數,因為表達式 main(argc, argv) 返回了一個 int 類型的值?,F在大家比較習慣寫成這樣:

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

但是基本的結構還是一樣的。

對于簡單的類型來說這種巧妙的語法思想是能很好工作的,但是一旦類型變得復雜就會令人感到困惑了。非常經典的一個例子就是聲明一個函數指針。遵循著規則,你得到了下面的這種寫法:

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

fp 是一個指向函數的指針,因為如果你寫一個表達式 (*fp)(a, b) 你會調用函數并得到一個 int 類型的值。那如果 fp 的其中一個入參它本身也是一個函數呢?

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

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

當然,我們可以在聲明一個函數的時候去掉參數名,那么 main 函數可以聲明成:

int main(int, char *[])

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

char *agrv[]

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

然后我們再來看看如果我們將入參變量名去掉的情況下 fp 函數的聲明是怎么樣的:

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

無論將變量名放在內部的哪里都不那么清晰明了。對于第一個入參:

int (*)(int, int)

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

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

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

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

不過還有一點需要提出。因為類型和聲明的語法是相同的,所以解析中間類型的表達式是很困難的。這就是為什么 C 的類型轉換總是用括號括起來:

(int)M_PI

Go 語法

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

x: intp: pointer to inta: array[3] of int

這些聲明是明確的,如果從左往右讀你會發現也是詳細的。Go 語言從中得到了啟發,但為了簡潔起見,刪除了冒號和一些關鍵字:

x intp *inta [3]int

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

現在讓我們考慮下函數。讓我們把這個聲明寫成 Go 的形式,盡管在 Go 中真正的 main 函數是沒有入參的:

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

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

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

即便舍去變量名還是很明確——因為對于類型聲明上沒有位置的變化,所以也沒有什么困惑。

func main(int, []string) int

這種從左到右的風格有一個優點:就算類型變得越來越復雜,這種方式還是表現得很得當。

舉個聲明函數變量的例子(類似在 C 語言中的函數指針):

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

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

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

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

類型和表達式的語法的不同點使得在 Go 中編寫和調用閉包是那么的簡單:

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

指針

指針這家伙總是表現得“與眾不同”一點。觀察下數組和切片,舉個例子,Go 的類型語法將方括號放在類型的左邊,但是賦值表達式語法卻是將其放在表達式的右邊:

var a []intx = a[1]

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

var p *intx = *p

我們不能簡單粗暴地改成這樣:

var p *intx = p*

因為后綴 會與乘法的 相混淆。那或許我們可以使用 ^,舉個例子:

var p ^intx = p^

但同樣的這個符號也已經有其他含義了,類型和表達式在前綴后綴的問題上總是在許多方面使事情復雜化。舉個例子,

[]int("hi")

這是一種寫法,但一旦以 * 打頭就必須用括號將其包?。?/p>

(*int)(nil)

如果我們愿意放棄 * 作為指針語法,那么這些括號就不是必要的了。(譯者注:但還能有更好的指針語法嗎。。。)

所以 Go 的指針語法與熟悉的 C 語言是類似的,但這個關聯也意味著我們不得不使用括號來消除語法中的類型和表達式之間的差異。

總體而言,我們相信 Go 的類型語法比 C 的要更容易理解,尤其是當事情變得復雜的時候。

關于Go語言為何要采用這種倒序語法呢?

Go的設計者Rob Pike的一篇介紹Go聲明語法的文章給出了答案,其中談到了Go聲明語法的設計考量。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产ts人妖一区二区三区| 久久成人精品视频| 色婷婷综合久久久久中文字幕1| 久久久久久久亚洲精品| 热re91久久精品国99热蜜臀| 亚洲国产日韩欧美在线99| 亚洲免费人成在线视频观看| 日韩精品高清在线观看| 一区二区成人av| 亚洲午夜精品久久久久久久久久久久| 久久精品国产69国产精品亚洲| 热久久视久久精品18亚洲精品| 久久精视频免费在线久久完整在线看| 在线视频日韩精品| 国产精品男人的天堂| 中文国产成人精品久久一| 91干在线观看| 欧美午夜宅男影院在线观看| 国产精品视频久久久久| 91日本在线视频| 亚洲第一精品久久忘忧草社区| 伊人精品在线观看| 久久天天躁狠狠躁老女人| 黑人精品xxx一区| 国产人妖伪娘一区91| 成人黄色av网站| 精品国产精品自拍| 欧美黄色片视频| 91精品国产91久久久久久最新| 亚洲欧美日韩精品| 欧美激情喷水视频| 茄子视频成人在线| 亚洲免费av网址| 午夜精品久久久久久久久久久久久| 亚洲另类欧美自拍| 国产成人综合一区二区三区| 久久露脸国产精品| 国产成人精品视| 国产精品69久久久久| 久热精品视频在线观看| 久久伊人精品一区二区三区| 97视频在线免费观看| 成人福利在线视频| 亚洲日韩第一页| 欧美性jizz18性欧美| 日日噜噜噜夜夜爽亚洲精品| 欧美亚洲另类在线| 最新91在线视频| 亚洲激情视频网站| 日韩免费中文字幕| 中文字幕日韩免费视频| 欧美国产精品人人做人人爱| 欧美视频在线观看 亚洲欧| 亚洲精品中文字幕有码专区| 欧美激情免费视频| 精品久久久久久久久国产字幕| 欧美国产日韩视频| 91视频国产一区| 国产欧美精品va在线观看| 国产成人极品视频| 精品欧美国产一区二区三区| 国产精品∨欧美精品v日韩精品| 国产日韩欧美黄色| 亚洲毛茸茸少妇高潮呻吟| 欧美激情视频一区二区| 少妇高潮 亚洲精品| 91九色国产在线| 91色p视频在线| 成人h视频在线观看播放| 欧美日本亚洲视频| 社区色欧美激情 | 一区二区三区四区精品| 亚洲第一色在线| 操人视频在线观看欧美| 色噜噜亚洲精品中文字幕| 91系列在线观看| 亚洲性生活视频在线观看| 欧美高清视频在线观看| 精品激情国产视频| 久久精品中文字幕免费mv| 美女av一区二区三区| 精品国产一区二区三区在线观看| 有码中文亚洲精品| 国产伦精品一区二区三区精品视频| 粉嫩av一区二区三区免费野| 日韩精品极品视频免费观看| 国产成人精品免高潮费视频| 久久精品国产一区| 国产成人亚洲综合| 91色中文字幕| 热久久99这里有精品| 欧美日韩国产二区| 综合网日日天干夜夜久久| 国内精品美女av在线播放| 亚洲一区免费网站| 一区二区三欧美| 国产91热爆ts人妖在线| 国产亚洲视频在线| 国产精品一区二区3区| 国产精品美女网站| 色婷婷综合成人av| 国产精品日韩久久久久| 亚洲黄在线观看| 揄拍成人国产精品视频| 日本成人黄色片| 一区三区二区视频| 国产亚洲欧美aaaa| 最近免费中文字幕视频2019| 欧美午夜激情视频| 欧美激情手机在线视频| 精品久久久免费| 久久精品91久久久久久再现| 亚洲成人网在线| 欧美激情一区二区三区久久久| 久久久黄色av| 欧美夜福利tv在线| 日韩成人中文电影| 国语自产精品视频在线看抢先版图片| 91干在线观看| 亚洲第一二三四五区| 国产精品日日摸夜夜添夜夜av| 久久综合久久八八| 亚洲精品美女在线观看| 亚州精品天堂中文字幕| 亚洲999一在线观看www| 欧美激情免费看| 久久综合久中文字幕青草| 欧美成人第一页| 亚洲电影免费观看高清完整版在线| 97在线视频免费播放| 国产一区二区三区在线看| 亚洲r级在线观看| 成人精品久久av网站| 中文字幕亚洲综合久久| 国产suv精品一区二区| 91精品国产高清| 欧美精品电影免费在线观看| 91精品国产电影| 亚洲男人的天堂在线| 日韩精品一二三四区| 久久久精品视频成人| 成人精品视频在线| 国产一区二区三区在线免费观看| 亚洲精品久久久久中文字幕欢迎你| 欧美成人自拍视频| 亚洲一区二区三区视频播放| 日韩成人av一区| 国产亚洲欧美日韩精品| 欧美激情免费观看| 91啪国产在线| 日韩欧美中文字幕在线播放| 亚洲最大av在线| 欧美激情视频网址| 欧美贵妇videos办公室| 91免费国产网站| 久久精品色欧美aⅴ一区二区| 欧美国产日韩中文字幕在线| 成人黄色短视频在线观看| 大伊人狠狠躁夜夜躁av一区| 国产成人综合亚洲| 日韩免费看的电影电视剧大全| 国产精品国产自产拍高清av水多| 欧美一级高清免费播放| 成人精品久久一区二区三区|