不是為了與眾不同。而是為了更加清晰易懂。
我們提供的服務(wù)有:網(wǎng)站建設(shè)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、惠安ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的惠安網(wǎng)站制作公司
Rob Pike 曾經(jīng)在 Go 官方博客解釋過(guò)這個(gè)問(wèn)題(原文地址:),簡(jiǎn)略翻譯如下(水平有限翻譯的不對(duì)的地方見(jiàn)諒):
引言
Go語(yǔ)言新人常常會(huì)很疑惑為什么這門(mén)語(yǔ)言的聲明語(yǔ)法(declaration syntax)會(huì)和傳統(tǒng)的C家族語(yǔ)言不同。在這篇博文里,我們會(huì)進(jìn)行一個(gè)比較,并做出解答。
C 的語(yǔ)法
首先,先看看 C 的語(yǔ)法。C 采用了一種聰明而不同尋常的聲明語(yǔ)法。聲明變量時(shí),只需寫(xiě)出一個(gè)帶有目標(biāo)變量名的表達(dá)式,然后在表達(dá)式里指明該表達(dá)式本身的類(lèi)型即可。比如:
int x;
上面的代碼聲明了 x 變量,并且其類(lèi)型為 int——即,表達(dá)式 x 為 int 類(lèi)型。一般而言,為了指明新變量的類(lèi)型,我們得寫(xiě)出一個(gè)表達(dá)式,其中含有我們要聲明的變量,這個(gè)表達(dá)式運(yùn)算的結(jié)果值屬于某種基本類(lèi)型,我們把這種基本類(lèi)型寫(xiě)到表達(dá)式的左邊。所以,下述聲明:
int *p;
int a[3];
指明了 p 是一個(gè)int類(lèi)型的指針,因?yàn)?*p 的類(lèi)型為 int。而 a 是一個(gè) int 數(shù)組,因?yàn)?a[3] 的類(lèi)型為 int(別管這里出現(xiàn)的索引值,它只是用于指明數(shù)組的長(zhǎng)度)。
我們接下來(lái)看看函數(shù)聲明的情況。C 的函數(shù)聲明中關(guān)于參數(shù)的類(lèi)型是寫(xiě)在括號(hào)外的,像下面這樣:
int main(argc, argv)
int argc;
char *argv[];
{ /* ... */ }
如前所述,我們可以看到 main 之所以是函數(shù),是因?yàn)楸磉_(dá)式 main(argc, argv) 返回 int。在現(xiàn)代記法中我們是這么寫(xiě)的:
int main(int argc, char *argv[]) { /* ... */ }
盡管看起來(lái)有些不同,但是基本的結(jié)構(gòu)是一樣的。
總的來(lái)看,當(dāng)類(lèi)型比較簡(jiǎn)單時(shí),C的語(yǔ)法顯得很聰明。但是遺憾的是一旦類(lèi)型開(kāi)始復(fù)雜,C的這套語(yǔ)法很快就能讓人迷糊了。著名的例子如函數(shù)指針,我們得按下面這樣來(lái)寫(xiě):
int (*fp)(int a, int b);
在這兒,fp 之所以是一個(gè)指針是因?yàn)槿绻銓?xiě)出 (*fp)(a, b) 這樣的表達(dá)式將會(huì)調(diào)用一個(gè)函數(shù),其返回 int 類(lèi)型的值。如果當(dāng) fp 的某個(gè)參數(shù)本身又是一個(gè)函數(shù),情況會(huì)怎樣呢?
int (*fp)(int (*ff)(int x, int y), int b)
這讀起來(lái)可就點(diǎn)難了。
當(dāng)然了,我們聲明函數(shù)時(shí)是可以不寫(xiě)明參數(shù)的名稱(chēng)的,因此 main 函數(shù)可以聲明為:
int main(int, char *[])
回想一下,之前 argv 是下面這樣的
char *argv[]
你有沒(méi)有發(fā)現(xiàn)你是從聲明的「中間」去掉變量名而后構(gòu)造出其變量類(lèi)型的?盡管這不是很明顯,但你聲明某個(gè) char *[] 類(lèi)型的變量的時(shí)候,竟然需要把名字插入到變量類(lèi)型的中間。
我們?cè)賮?lái)看看,如果我們不命名 fp 的參數(shù)會(huì)怎樣:
int (*fp)(int (*)(int, int), int)
這東西難懂的地方可不僅僅是要記得參數(shù)名原本是放這中間的
int (*)(int, int)
它更讓人混淆的地方還在于甚至可能都搞不清這竟然是個(gè)函數(shù)指針聲明。我們接著看看,如果返回值也是個(gè)函數(shù)指針類(lèi)型又會(huì)怎么樣
int (*(*fp)(int (*)(int, int), int))(int, int)
這已經(jīng)很難看出是關(guān)于 fp 的聲明了。
你自己還可以構(gòu)建出比這更復(fù)雜的例子,但這已經(jīng)足以解釋 C 的聲明語(yǔ)法引入的某些復(fù)雜性了。
還有一點(diǎn)需要指出,由于類(lèi)型語(yǔ)法和聲明語(yǔ)法是一樣的,要解析中間帶有類(lèi)型的表達(dá)式可能會(huì)有些難度。這也就是為什么,C 在做類(lèi)型轉(zhuǎn)換的時(shí)候總是要把類(lèi)型用括號(hào)括起來(lái)的原因,像這樣
(int)M_PI
Go 的語(yǔ)法
非C家族的語(yǔ)言通常在聲明時(shí)使用一種不同的類(lèi)型語(yǔ)法。一般是名字先出現(xiàn),然后常常跟著一個(gè)冒號(hào)。按照這樣來(lái)寫(xiě),我們上面所舉的例子就會(huì)變成下面這樣:
x: int
p: pointer to int
a: array[3] of int
這樣的聲明即便有些冗長(zhǎng),當(dāng)至少是清晰的——你只需從左向右讀就行。Go 語(yǔ)言所采用的方案就是以此為基礎(chǔ)的,但為了追求簡(jiǎn)潔性,Go 語(yǔ)言丟掉了冒號(hào)并去掉了部分關(guān)鍵詞,成了下面這樣:
x int
p *int
a [3]int
在 [3]int 和表達(dá)式中 a 的用法沒(méi)有直接的對(duì)應(yīng)關(guān)系(我們?cè)谙乱还?jié)會(huì)回過(guò)頭來(lái)探討指針的問(wèn)題)。至此,你獲得了代碼清晰性方面的提升,但付出的代價(jià)是語(yǔ)法上需要區(qū)別對(duì)待。
下面我們來(lái)考慮函數(shù)的問(wèn)題。雖然在 Go 語(yǔ)言里,main 函數(shù)實(shí)際上沒(méi)有參數(shù),但是我們先謄抄一下之前的 main 函數(shù)的聲明:
func main(argc int, argv *[]byte) int
粗略一看和 C 沒(méi)什么不同,不過(guò)自左向右讀的話(huà)還不錯(cuò)。
main 函數(shù)接受一個(gè) int 和一個(gè)指針并返回一個(gè) int。
如果此時(shí)把參數(shù)名去掉,它還是很清楚——因?yàn)閰?shù)名總在類(lèi)型的前面,所以不會(huì)引起混淆。
func main(int, *[]byte) int
這種自左向右風(fēng)格的聲明的一個(gè)價(jià)值在于,當(dāng)類(lèi)型變得更復(fù)雜時(shí),它依然相對(duì)簡(jiǎn)單。下面是一個(gè)函數(shù)變量的聲明(相當(dāng)于 C 語(yǔ)言里的函數(shù)指針)
f func(func(int,int) int, int) int
或者當(dāng)它返回一個(gè)函數(shù)時(shí):
f func(func(int,int) int, int) func(int, int) int
上面的聲明讀起來(lái)還是很清晰,自左向右,而且究竟哪一個(gè)變量名是當(dāng)前被聲明的也容易看懂——因?yàn)樽兞棵肋h(yuǎn)在首位。
類(lèi)型語(yǔ)法和表達(dá)式語(yǔ)法帶來(lái)的差別使得在 Go 語(yǔ)言里調(diào)用閉包也變得更簡(jiǎn)單:
sum := func(a, b int) int { return a+b } (3, 4)
指針
指針有些例外。注意在數(shù)組 (array )和切片 (slice) 中,Go 的類(lèi)型語(yǔ)法把方括號(hào)放在了類(lèi)型的左邊,但是在表達(dá)式語(yǔ)法中卻又把方括號(hào)放到了右邊:
var a []int
x = a[1]
類(lèi)似的,Go 的指針沿用了 C 的 * 記法,但是我們寫(xiě)的時(shí)候也是聲明時(shí) * 在變量名右邊,但在表達(dá)式中卻又得把 * 放到左左邊:
var p *int
x = *p
不能寫(xiě)成下面這樣
var p *int
x = p*
因?yàn)楹缶Y的 * 可能會(huì)和乘法運(yùn)算混淆,也許我們可以改用 Pascal 的 ^ 標(biāo)記,像這樣
var p ^int
x = p^
我們也許還真的應(yīng)該把 * 像上面這樣改成 ^ (當(dāng)然這么一改 xor 運(yùn)算的符號(hào)也得改),因?yàn)樵陬?lèi)型和表達(dá)式中的 * 前綴確實(shí)把好些事兒都搞得有點(diǎn)復(fù)雜,舉個(gè)例子來(lái)說(shuō),雖然我們可以像下面這樣寫(xiě)
[]int("hi")
但在轉(zhuǎn)換時(shí),如果類(lèi)型是以 * 開(kāi)頭的,就得加上括號(hào):
(*int)(nil)
如果有一天我們?cè)敢夥艞売?* 作為指針語(yǔ)法的話(huà),那么上面的括號(hào)就可以省略了。
可見(jiàn),Go 的指針語(yǔ)法是和 C 相似的。但這種相似也意味著我們無(wú)法徹底避免在文法中有時(shí)為了避免類(lèi)型和表達(dá)式的歧義需要補(bǔ)充括號(hào)的情況。
總而言之,盡管存在不足,但我們相信 Go 的類(lèi)型語(yǔ)法要比 C 的容易懂。特別是當(dāng)類(lèi)型比較復(fù)雜時(shí)。
其實(shí)是完全不一樣的的東西?uint64是64位無(wú)符號(hào)整形數(shù)據(jù) 每個(gè)整數(shù)用64位2進(jìn)制數(shù)去編碼 表示的數(shù)據(jù)范圍是0~2^64-1 0~18446744073709551615 而沒(méi)有經(jīng)過(guò)任何類(lèi)型指定的數(shù)據(jù)matlab默認(rèn)是double類(lèi)型的浮點(diǎn)數(shù) 雖然也是占據(jù)64位,但是用的是浮點(diǎn)數(shù)的儲(chǔ)存...
作為一個(gè)測(cè)試,作為一個(gè)測(cè)試開(kāi)發(fā), 全?;?管理 是我們未來(lái)的發(fā)展方向。已經(jīng)掌握了Java、Python、HTML的你,是不是也想了解下最近異?;鸨腉o語(yǔ)言呢?來(lái)吧,讓我們一起了解下。
Go 是一個(gè)開(kāi)源的編程語(yǔ)言 ,它能讓構(gòu)造簡(jiǎn)單、可靠且高效的軟件變得容易。
Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開(kāi)發(fā),后來(lái)還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開(kāi)源,在2012年早些時(shí)候發(fā)布了Go 1穩(wěn)定版本。現(xiàn)在Go的開(kāi)發(fā)已經(jīng)是完全開(kāi)放的,并且擁有一個(gè)活躍的社區(qū)。這三個(gè)人都是計(jì)算機(jī)界的大神,有的參與了C語(yǔ)言的編寫(xiě),有的還是數(shù)學(xué)大神,有的還獲得了計(jì)算機(jī)最高榮譽(yù)-圖靈獎(jiǎng)。
接下來(lái)說(shuō)說(shuō) Go語(yǔ)言的特色 :
簡(jiǎn)潔、快速、安全
并行、有趣、開(kāi)源
內(nèi)存管理、數(shù)組安全、編譯迅速
Go語(yǔ)言的用途 :
Go 語(yǔ)言被設(shè)計(jì)成一門(mén)應(yīng)用于搭載 Web 服務(wù)器,存儲(chǔ)集群或類(lèi)似用途的巨型中央服務(wù)器的系統(tǒng)編程語(yǔ)言。
對(duì)于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語(yǔ)言無(wú)疑比大多數(shù)其它語(yǔ)言有著更高的開(kāi)發(fā)效率。它提供了海量并行的支持,這對(duì)于 游戲 服務(wù)端的開(kāi)發(fā)而言是再好不過(guò)了。
Go語(yǔ)言的環(huán)境安裝:
建議直接打開(kāi) 官方地址因?yàn)閴Φ脑虼虿婚_(kāi)
因?yàn)槲矣玫氖莣indows系統(tǒng),這里主要講下Windows系統(tǒng)上使用Go語(yǔ)言來(lái)編程。
Windows 下可以使用 .msi 后綴(在下載列表中可以找到該文件,如go1.17.2.windows-amd64.msi)的安裝包來(lái)安裝。
默認(rèn)情況下 .msi 文件會(huì)安裝在 c:Go 目錄下。你可以將 c:Gobin 目錄添加到 Path 環(huán)境變量中。添加后你需要重啟命令窗口才能生效。個(gè)人建議還是安裝到 Program Files文件夾中。
使用什么開(kāi)發(fā)工具來(lái)對(duì)Go語(yǔ)言進(jìn)行編寫(xiě):
個(gè)人建議用VS code, 也可以用Sublime Text來(lái)編輯。如果你之前看了我講的HTML語(yǔ)言的學(xué)習(xí),肯定已經(jīng)下載了VS code. 那么這時(shí)你需要在VS code中下載Go語(yǔ)言的擴(kuò)展插件。
這里有一個(gè)巨大的坑,就是在下載Go的插件和依賴(lài)包時(shí),會(huì)提示一些包沒(méi)有。主要是因?yàn)橄螺d的依賴(lài)包部分被墻了,只能想別的辦法去下載。
建議參考網(wǎng)頁(yè):
解決vscode中g(shù)olang插件安裝失敗方法
在學(xué)習(xí)go的過(guò)程中,使用的是vscode,但是一直提示安裝相關(guān)插件失敗,然后上網(wǎng)查方法,基本上是叫你建立golang.org目錄什么的,結(jié)果全是錯(cuò)的,而且都是抄襲,很煩。無(wú)意之中看到一位博主分享的方法,他也是飽受上述的垃圾博文困擾,然后找到了解決方法,這里向他致敬,秉著讓更多人看到正確解決方法的心,我寫(xiě)下正確的解決方法,希望對(duì)你有所幫助,也可以點(diǎn)開(kāi)原博主鏈接參考:
Go有一個(gè)全球模塊代理,設(shè)置代理再去安裝golang的插件,就可以安裝成功了。步驟有,首先Windows用戶(hù)打開(kāi)Powershell,一個(gè)藍(lán)色的界面,注意不是cmd!不知道的直接打開(kāi)window下面的搜索,然后輸入powershell,搜索出來(lái)就可以了。
$env:GO111MODULE=“on”
$env:GOPROXY=“”
go env -w GOPROXY=
go env -w GOPRIVATE=*.corp.example.com
然后我們打開(kāi)VsCode界面,下面會(huì)提示安裝插件,我們選擇Install ALL,就會(huì)安裝成功
當(dāng)你在運(yùn)行Go語(yǔ)言程序時(shí),提示所有的插件包都已經(jīng)安裝成功了時(shí),就可以正常使用了,要不然一堆報(bào)錯(cuò)會(huì)讓你非常心煩。
好了,今天先到這里,晚安、下班~