您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)golang特有程序結(jié)構(gòu)的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
Go語(yǔ)言亦叫Golong語(yǔ)言,是由谷歌Goggle公司推出。Go語(yǔ)言的主要開(kāi)發(fā)者有:肯.湯姆遜(Ken Thompson)、羅布.派克(Rob Pike)和羅伯特.格里澤默(Robert Griesemer)。這三個(gè)都是大神,稍介紹一下他們的貢獻(xiàn):
肯.湯姆遜(Ken Thompson):圖靈獎(jiǎng)得主,Uinx發(fā)明人,B語(yǔ)言作者(C語(yǔ)言前身),還做飛行員,后來(lái)被谷歌挖走。
羅布.派克(Rob Pike):Unix團(tuán)隊(duì)和Plan 9操作系統(tǒng)計(jì)劃的成員,與Ken老爺子共事多年,并共創(chuàng)出廣泛使用的UTF-8 字元編碼。
羅伯特.格里澤默(Robert Griesemer):曾協(xié)助制作Java的HotSpot編譯器,和Chrome瀏覽器的JavaScript引擎V8。
Go語(yǔ)言保證了既能到達(dá)靜態(tài)編譯語(yǔ)言的安全和性能,又達(dá)到了動(dòng)態(tài)語(yǔ)言開(kāi)發(fā)速度和易維護(hù)性,有人形容Go語(yǔ)言:Go = C + Python , 說(shuō)明Go語(yǔ)言既有C靜態(tài)語(yǔ)言程序的運(yùn)行速度,又能達(dá)到Python動(dòng)態(tài)語(yǔ)言的快速開(kāi)發(fā)。
提示:本系列文章適合對(duì)Go有持續(xù)沖動(dòng)的讀者
閱前須知:在程序結(jié)構(gòu)這章,更多會(huì)關(guān)注golang中特有結(jié)構(gòu),與其他語(yǔ)言如C、python中相似結(jié)構(gòu)(命名、聲明、賦值、作用域等)不再贅述。
在go1.9中引入類(lèi)型別名的特性,其中兩個(gè)內(nèi)置類(lèi)型byte
、 rune
是uint8
和int32
的別名。類(lèi)型別名即字面意思換個(gè)名字,兩者是相同類(lèi)型。
類(lèi)型聲明語(yǔ)句一般出現(xiàn)在包一級(jí),因此如果新創(chuàng)建的類(lèi)型名字的首字符大寫(xiě),則在包外部也可以使用。
解決問(wèn)題:大規(guī)模重構(gòu)期間啟用漸進(jìn)式代碼修復(fù),特別是將類(lèi)型從一個(gè)包移動(dòng)到另一個(gè)包,以便引用舊名稱(chēng)的代碼與引用新名稱(chēng)的代碼互操作。類(lèi)型別名對(duì)于允許使用單個(gè)頂級(jí)導(dǎo)出 API 將大型包拆分為多個(gè)實(shí)現(xiàn)包,以及對(duì)現(xiàn)有包的擴(kuò)展版本進(jìn)行試驗(yàn)也可能很有用。
定義方法:
type T1 = T2
提案地址:18130-type-alias
1.如果初始化表達(dá)式被省略,那么將用零值初始化該變量,即如下:
int
-->0
bool
-->false
string
-->""
接口類(lèi)型
:slice、指針、map、chan、函數(shù) -->nil
數(shù)組或結(jié)構(gòu)體
: 每個(gè)元素或字段初始為對(duì)應(yīng)類(lèi)型零值
零值初始化機(jī)制可以確保每個(gè)聲明的變量總是有一個(gè)良好定義的值,這個(gè)特性可以減少許多額外工作
2.函數(shù)返回值初始化變量,比如err的獲取。在賦值語(yǔ)句左邊的變量和右邊最終的求到的值必須有相同的數(shù)據(jù)類(lèi)型。
if err:=http.Get(addr),err{ // }
3.初始化表達(dá)式可以是字面量或任意的表達(dá)式。在包級(jí)別聲明的變量會(huì)在main入口函數(shù)執(zhí)行前完成初始化,局部變量將在聲明語(yǔ)句被執(zhí)行到的時(shí)候完成初始化
4.簡(jiǎn)短式(:=
)局部變量聲明只可用于局部變量聲明。并且簡(jiǎn)短變量聲明語(yǔ)句對(duì)這些已經(jīng)聲明過(guò)的變量具有賦值行為。如下第二個(gè)聲明只聲明了out一個(gè)變量。
in, err := os.Open(infile) // ... out, err := os.Create(outfile)
5.函數(shù)內(nèi)生命的變量必須使用,不過(guò)可以使用下劃線_
丟棄。
對(duì)于在包一級(jí)聲明的變量來(lái)說(shuō),它們的生命周期和整個(gè)程序的運(yùn)行周期是一致的。
而相比之下,局部變量的生命周期則是動(dòng)態(tài)的:每次從創(chuàng)建一個(gè)新變量的聲明語(yǔ)句開(kāi)始,直到該變量不再被引用為止,然后變量的存儲(chǔ)空間可能被回收。
函數(shù)的參數(shù)變量和返回值變量都是局部變量。它們?cè)诤瘮?shù)每次被調(diào)用的時(shí)候創(chuàng)建。
1. package
:對(duì)一組函數(shù)或功能的封裝,即避免重復(fù)造輪子。
在1.12之后版本(引入了module)安裝后,會(huì)在用戶(hù)目錄下創(chuàng)建一個(gè) go 文件夾作為默認(rèn)的 GOPATH,go get 會(huì)將遠(yuǎn)程的軟件包下載到GOPTH目錄下 pkg/mod
里。GOROOT為go文件和安裝目錄。$GOROOT/src
為內(nèi)置標(biāo)準(zhǔn)庫(kù)。
GOPATH
目錄已下載的package
$GOROOT/src
目錄內(nèi)置package
在沒(méi)有使用 golang module 前導(dǎo)入他人分享的 package 需要先使用 go get 下載到本地,然后才可以通過(guò)import引用此 package
2. module
:對(duì)package進(jìn)行管理,即管理應(yīng)用的依賴(lài)和package版本。
引入module后項(xiàng)目目錄不再只限制在GOPATH/src,你可以在任意文件夾下創(chuàng)建你的項(xiàng)目,再使用go mod init
初始化即可。如下初始化一個(gè)module為github.com/csgo 在當(dāng)前文件夾下產(chǎn)生go.mod文件。
[root@VM-0-5-centos water_man]# ls go.mod water_man.go [root@VM-0-5-centos water_man]# cat go.mod module github.com/csgo //文件名稱(chēng) go 1.15 //go版本 replace github.com/csgo/rush_b => ../rush_b //重定向package到../rush_b文件夾下 require github.com/csgo/rush_b v0.0.0-00010101000000-000000000000 //非標(biāo)準(zhǔn)庫(kù)依賴(lài)包和版本
上層目錄下自定義的package:
go module會(huì)根據(jù) go.mod 的依賴(lài)引用關(guān)系導(dǎo)入三方包。如果發(fā)現(xiàn)本地cache沒(méi)有,就會(huì)從遠(yuǎn)程拉取。即如果github.com/csgo/rush_b未重定向到本地就會(huì)使用 go get 。當(dāng) go module下載了遠(yuǎn)程包后,同時(shí)會(huì)自動(dòng)更新 go.mod 。
需要注意自定義的package函數(shù)、變量如果需要被外部引用則首字母應(yīng)大寫(xiě),即包級(jí)別的名字都是以大寫(xiě)字母開(kāi)頭。
關(guān)于“golang特有程序結(jié)構(gòu)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。