最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年11月27日 11:33:51   作者:Rob Pike  
Golang 就是類C的語法,下面這篇文章主要給大家介紹了關(guān)于Go語言學(xué)習(xí)教程之聲明語法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

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

C 變量

首先,讓我們說說 C 中的語法。C 使用了一種不尋常的巧妙的方法來實(shí)現(xiàn)聲明語法。我們不是用什么特殊的語法來描述類型,而是寫一個(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]' (這里請忽略下標(biāo)的值 3,它只是說明數(shù)組的大?。┑念愋褪?int。

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

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

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

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

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

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

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

fp 是一個(gè)指向函數(shù)的指針,因?yàn)槿绻銓懸粋€(gè)表達(dá)式 (*fp)(a, b) 你會調(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í)是令人困惑的。

然后我們再來看看如果我們將入?yún)⒆兞棵サ舻那闆r下 fp 函數(shù)的聲明是怎么樣的:

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

無論將變量名放在內(nèi)部的哪里都不那么清晰明了。對于第一個(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 的聲明語法可能引入的一些困難。

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

(int)M_PI

Go 語法

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

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

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

x int
p *int
a [3]int

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

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

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

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

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

即便舍去變量名還是很明確——因?yàn)閷τ陬愋吐暶魃蠜]有位置的變化,所以也沒有什么困惑。

func main(int, []string) int

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

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

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

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

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

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

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

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

指針

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

var a []int
x = a[1]

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

var p *int
x = *p

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

var p *int
x = p*

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

var p ^int
x = p^

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

[]int("hi")

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

(*int)(nil)

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Go語言 init函數(shù)的具體使用

    Go語言 init函數(shù)的具體使用

    init()函數(shù)是Go語言中一種特殊的函數(shù),用于在包被導(dǎo)入時(shí)執(zhí)行一次性的初始化操作,本文就來介紹一下Go語言 init函數(shù)的具體使用,感興趣的可以了解一下
    2024-09-09
  • goland把go項(xiàng)目打包進(jìn)docker鏡像的全過程記錄

    goland把go項(xiàng)目打包進(jìn)docker鏡像的全過程記錄

    golang編譯的應(yīng)用是不需要依賴其他運(yùn)行環(huán)境的,下面這篇文章主要給大家介紹了關(guān)于goland把go項(xiàng)目打包進(jìn)docker鏡像的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Go語言中http.ResponseWriter接口

    Go語言中http.ResponseWriter接口

    http.ResponseWriter是Go語言中用來設(shè)置HTTP響應(yīng)的接口,本文主要介紹了Go語言中http.ResponseWriter接口,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • 一篇文章帶你搞懂Go語言標(biāo)準(zhǔn)庫Time

    一篇文章帶你搞懂Go語言標(biāo)準(zhǔn)庫Time

    在我們開發(fā)的過程中,每個(gè)項(xiàng)目都需要時(shí)間這一類的函數(shù),此時(shí)對time這個(gè)包的研究深度就顯得尤為重要,這篇文章主要給大家介紹了關(guān)于如何通過一篇文章帶你搞懂Go語言標(biāo)準(zhǔn)庫Time的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Go函數(shù)全景從基礎(chǔ)到高階深度剖析

    Go函數(shù)全景從基礎(chǔ)到高階深度剖析

    本文深入探索Go語言中的函數(shù)特性,從基礎(chǔ)函數(shù)定義到特殊函數(shù)類型,再到高階函數(shù)的使用和函數(shù)調(diào)用優(yōu)化,通過詳細(xì)的代碼示例和專業(yè)解析,讀者不僅可以掌握函數(shù)的核心概念,還能了解如何在實(shí)踐中有效利用這些特性來提高代碼質(zhì)量和性能
    2023-10-10
  • Go語言map用法實(shí)例分析

    Go語言map用法實(shí)例分析

    這篇文章主要介紹了Go語言map用法,實(shí)例分析了map的功能及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語言接口的用法詳解

    Go語言接口的用法詳解

    本文詳細(xì)講解了Go語言接口的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼

    Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼

    Go語言的標(biāo)準(zhǔn)庫math提供了一系列基礎(chǔ)數(shù)學(xué)函數(shù)和常量,用于進(jìn)行科學(xué)計(jì)算、幾何計(jì)算和其他數(shù)學(xué)相關(guān)的操作,這篇文章主要介紹了Go語言標(biāo)準(zhǔn)庫中math模塊詳細(xì)功能介紹與示例代碼,需要的朋友可以參考下
    2025-03-03
  • 重學(xué)Go語言之文件操作詳解

    重學(xué)Go語言之文件操作詳解

    有很多場景都需要對文件進(jìn)行讀取或者寫入,比如讀取配置文件或者寫入日志文件,在Go語言中,操作文件應(yīng)該算是一件比較簡單的事情,我們在這一篇文章中,一起來探究一下
    2023-08-08
  • Go項(xiàng)目實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟功能

    Go項(xiàng)目實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟功能

    無論是優(yōu)雅關(guān)機(jī)還是優(yōu)雅重啟歸根結(jié)底都是通過監(jiān)聽特定系統(tǒng)信號,然后執(zhí)行一定的邏輯處理保障當(dāng)前系統(tǒng)正在處理的請求被正常處理后再關(guān)閉當(dāng)前進(jìn)程,這篇文章主要介紹了Go實(shí)現(xiàn)優(yōu)雅關(guān)機(jī)與平滑重啟 ,需要的朋友可以參考下
    2022-10-10

最新評論

遵义市| 南城县| 卓资县| 东乌| 盐边县| 拉萨市| 奈曼旗| 滦南县| 玛多县| 铜梁县| 修文县| 崇左市| 贵州省| 萍乡市| 鸡东县| 昌黎县| 富源县| 隆安县| 长治县| 同心县| 宜昌市| 东城区| 宁化县| 荆州市| 济源市| 佛坪县| 忻城县| 宿松县| 武功县| 栖霞市| 清水县| 鄂尔多斯市| 宁乡县| 昭通市| 福州市| 交城县| 集贤县| 永修县| 泰和县| 五常市| 原阳县|