
1. go語言介紹
1.1.語言為并發(fā)而生
go語言(或 Golang)是Google開發(fā)的開源編程語言,誕生于2006年1月2日下午15點4分5秒,于2009年11月開源,2012年發(fā)布go穩(wěn)定版。
Go語言在多核并發(fā)上擁有原生的設(shè)計優(yōu)勢,Go語言從底層原生支持并發(fā),無須第三方庫、開發(fā)者的編程技巧和開發(fā)經(jīng)驗。
go是非常年輕的一門語言,它的主要目標(biāo)是“兼具Python 等動態(tài)語言的開發(fā)速度和C/C++等編譯型語言的性能與安全性”
很多公司,特別是中國的互聯(lián)網(wǎng)公司,即將或者已經(jīng)完成了使用 Go 語言改造舊系統(tǒng)的過程。
經(jīng)過 Go 語言重構(gòu)的系統(tǒng)能使用更少的硬件資源獲得更高的并發(fā)和I/O吞吐表現(xiàn)。
充分挖掘硬件設(shè)備的潛力也滿足當(dāng)前精細(xì)化運營的市場大環(huán)境。
Go語言的并發(fā)是基于 goroutine 的,goroutine 類似于線程,但并非線程。
可以將 goroutine 理解為一種虛擬線程。
Go 語言運行時會參與調(diào)度 goroutine,并將 goroutine 合理地分配到每個 CPU 中,最大限度地使用CPU性能。
開啟一個goroutine的消耗非常?。ù蠹s2KB的內(nèi)存),你可以輕松創(chuàng)建數(shù)百萬個goroutine。
goroutine的特點:
1.goroutine具有可增長的分段堆棧。這意味著它們只在需要時才會使用更多內(nèi)存。
2.goroutine的啟動時間比線程快。
3.goroutine原生支持利用channel安全地進(jìn)行通信。
4.goroutine共享數(shù)據(jù)結(jié)構(gòu)時無需使用互斥鎖。
1.2.Go語言簡單易學(xué)
1.2.1.語法簡潔
Go 語言簡單易學(xué),學(xué)習(xí)曲線平緩,不需要像 C/C++ 語言動輒需要兩到三年的學(xué)習(xí)期。
Go 語言被稱為“互聯(lián)網(wǎng)時代的C語言”,Go 語言的風(fēng)格類似于C語言,其語法在C語言的基礎(chǔ)上進(jìn)行了大幅的簡化,去掉了不需要的表達(dá)式括號,循環(huán)也只有 for 一種表示方法,就可以實現(xiàn)數(shù)值、鍵值等各種遍歷。
1.2.2.代碼風(fēng)格統(tǒng)一
Go 語言提供了一套格式化工具——go fmt。一些 Go 語言的開發(fā)環(huán)境或者編輯器在保存時,都會使用格式化工具進(jìn)行修改代碼的格式化,這樣就保證了不同開發(fā)者提交的代碼都是統(tǒng)一的格式。(吐槽下:再也不用擔(dān)心那些看不懂的黑魔法了…)
1.2.3.開發(fā)效率高

Go語言實現(xiàn)了開發(fā)效率與執(zhí)行效率的完美結(jié)合,讓你像寫Python代碼(效率)一樣編寫C代碼(性能)。
1.3.Go適合做什么
- 服務(wù)端開發(fā)
- 分布式系統(tǒng),微服務(wù)
- 網(wǎng)絡(luò)編程
- 區(qū)塊鏈開發(fā)
- 內(nèi)存KV數(shù)據(jù)庫,例如boltDB、levelDB
- 云平臺
1.4.學(xué)習(xí)Go語言的前景
目前Go語言已經(jīng)?泛應(yīng)用于人工智能、云計算開發(fā)、容器虛擬化、?數(shù)據(jù)開發(fā)、數(shù)據(jù)分析及科學(xué)計算、運維開發(fā)、爬蟲開發(fā)、游戲開發(fā)等領(lǐng)域。
Go語言簡單易學(xué),天生支持并發(fā),完美契合當(dāng)下高并發(fā)的互聯(lián)網(wǎng)生態(tài)。Go語言的崗位需求持續(xù)高漲,目前的Go程序員數(shù)量少,待遇好。
抓住趨勢,要學(xué)會做一個領(lǐng)跑者而不是跟隨者。
國內(nèi)Go語言的需求潛力巨大,目前無論是國內(nèi)大廠還是新興互聯(lián)網(wǎng)公司基本上都會有Go語言的崗位需求。
2. Go語言的主要特征
2.1.來歷
很久以前,有一個IT公司,這公司有個傳統(tǒng),允許員工擁有20%自由時間來開發(fā)實驗性項目。
在2007的某一天,公司的幾個大牛,正在用c++開發(fā)一些比較繁瑣但是核心的工作,主要包括龐大的分布式集群,大牛覺得很鬧心,后來c++委員會來他們公司演講,說c++將要添加大概35種新特性。
這幾個大牛的其中一個人,名為:Rob Pike,聽后心中一萬個xxx飄過,“c++特性還不夠多嗎?簡化c++應(yīng)該更有成就感吧”。
于是乎,Rob Pike和其他幾個大牛討論了一下,怎么解決這個問題,過了一會,Rob Pike說要不我們自己搞個語言吧,名字叫“go”,非常簡短,容易拼寫。
其他幾位大牛就說好啊,然后他們找了塊白板,在上面寫下希望能有哪些功能(詳見文尾)。
接下來的時間里,大牛們開心的討論設(shè)計這門語言的特性,經(jīng)過漫長的歲月,他們決定,以c語言為原型,以及借鑒其他語言的一些特性,來解放程序員,解放自己,然后在2009年,go語言誕生。
2.2.思想
Less can be more 大道至簡,小而蘊真 讓事情變得復(fù)雜很容易,讓事情變得簡單才難 深刻的工程文化
2.3.優(yōu)點
自帶gc。
靜態(tài)編譯,編譯好后,扔服務(wù)器直接運行。
簡單的思想,沒有繼承,多態(tài),類等。
豐富的庫和詳細(xì)的開發(fā)文檔。
語法層支持并發(fā),和擁有同步并發(fā)的channel類型,使并發(fā)開發(fā)變得非常方便。
簡潔的語法,提高開發(fā)效率,同時提高代碼的閱讀性和可維護(hù)性。
超級簡單的交叉編譯,僅需更改環(huán)境變量。
Go 語言是谷歌 2009 年首次推出并在 2012 年正式發(fā)布的一種全新的編程語言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性。
谷歌首席軟件工程師羅布派克(Rob Pike)說:我們之所以開發(fā) Go,是因為過去10多年間軟件開發(fā)的難度令人沮喪。
Google 對 Go 寄予厚望,其設(shè)計是讓軟件充分發(fā)揮多核心處理器同步多工的優(yōu)點,并可解決面向?qū)ο蟪绦蛟O(shè)計的麻煩。它具有現(xiàn)代的程序語言特色,如垃圾回收,幫助開發(fā)者處理瑣碎但重要的內(nèi)存管理問題。
Go 的速度也非???,幾乎和 C 或 C++ 程序一樣快,且能夠快速開發(fā)應(yīng)用程序。
2.4.Go語言的主要特征:
1.自動立即回收。
2.更豐富的內(nèi)置類型。
3.函數(shù)多返回值。
4.錯誤處理。
5.匿名函數(shù)和閉包。
6.類型和接口。
7.并發(fā)編程。
8.反射。
9.語言交互性。
2.5.Golang文件名:
所有的go源碼都是以 ".go" 結(jié)尾
2.6.Go言命名:
1.Go的函數(shù)、變量、常量、自定義類型、包(package)的命名方式遵循以下規(guī)則:
1)首字符可以是任意的Unicode字符或者下劃線
2)剩余字符可以是Unicode字符、下劃線、數(shù)字
3)字符長度不限
2.Go只有25個關(guān)鍵字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
3.Go還有37個保留字
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete
complex real imag
panic recover
4.可見性:
1)聲明在函數(shù)內(nèi)部,是函數(shù)的本地值,類似private
2)聲明在函數(shù)外部,是對當(dāng)前包可見(包內(nèi)所有.go文件都可見)的全局值,類似protect
3)聲明在函數(shù)外部且首字母大寫是所有包可見的全局值,類似public
2.7Go語言聲明:
有四種主要聲明方式:
var(聲明變量)
const(聲明常量)
type(聲明類型)
func(聲明函數(shù))
Go的程序是保存在多個.go文件中,文件的第一行就是package XXX聲明,用來說明該文件屬于哪個包(package),package聲明下來就是import聲明,再下來是類型,變量,常量,函數(shù)的聲明。
2.8.Go項目構(gòu)建及編譯
一個Go工程中主要包含以下三個目錄:
src:源代碼文件
pkg:包文件
bin:相關(guān)bin文件
1: 建立工程文件夾 goproject
2: 在工程文件夾中建立src,pkg,bin文件夾
3: 在GOPATH中添加projiect路徑 例 e:/goproject
4: 如工程中有自己的包examplepackage,那在src文件夾下建立以包名命名的文件夾 例 examplepackage
5:在src文件夾下編寫主程序代碼代碼 goproject.go
6:在examplepackage文件夾中編寫 examplepackage.go 和 包測試文件 examplepackage_test.go
7:編譯調(diào)試包
go build examplepackage
go test examplepackage
go install examplepackage
這時在pkg文件夾中可以發(fā)現(xiàn)會有一個相應(yīng)的操作系統(tǒng)文件夾如windows_386z, 在這個文件夾中會有examplepackage文件夾,在該文件中有examplepackage.a文件
8:編譯主程序
go build goproject.go
成功后會生成goproject.exe文件
至此一個Go工程編輯成功。
2.9. go 編譯問題
golang的編譯使用命令 go build , go install;除非僅寫一個main函數(shù),否則還是準(zhǔn)備好目錄結(jié)構(gòu); GOPATH=工程根目錄;其下應(yīng)創(chuàng)建src,pkg,bin目錄,bin目錄中用于生成可執(zhí)行文件,pkg目錄中用于生成.a文件; golang中的import name,實際是到GOPATH中去尋找name.a, 使用時是該name.a的源碼中生命的package 名字;這個在前面已經(jīng)介紹過了。
注意點:
1.系統(tǒng)編譯時 go install abc_name時,系統(tǒng)會到GOPATH的src目錄中尋找abc_name目錄,然后編譯其下的go文件;
2.同一個目錄中所有的go文件的package聲明必須相同,所以main方法要單獨放一個文件,否則在eclipse和liteide中都會報錯;
編譯報錯如下:(假設(shè)test目錄中有個main.go 和mymath.go,其中main.go聲明package為main,mymath.go聲明packag 為test);
$ go install test
can't load package: package test: found packages main (main.go) and test (mymath.go) in /home/wanjm/go/src/test
報錯說 不能加載package test(這是命令行的參數(shù)),因為發(fā)現(xiàn)了兩個package,分別時main.go 和 mymath.go;
3.對于main方法,只能在bin目錄下運行 go build path_tomain.go; 可以用-o參數(shù)指出輸出文件名;
4.可以添加參數(shù) go build -gcflags "-N -l" ,可以更好的便于gdb;詳細(xì)參見 http://golang.org/doc/gdb
5.gdb全局變量主一點。 如有全局變量 a;則應(yīng)寫為 p 'main.a';注意但引號不可少;
3. Go的成功案例
Nsq:Nsq 是由Go語言開發(fā)的高性能、高可用消息隊列系統(tǒng),性能非常高,每天能處理數(shù)十億條的消息;
Docker:基于lxc的一個虛擬打包工具,能夠?qū)崿F(xiàn)PAAS平臺的組建。
Packer:用來生成不同平臺的鏡像文件,例如VM、vbox、AWS等,作者是vagrant的作者
Skynet:分布式調(diào)度框架
Doozer:分布式同步工具,類似ZooKeeper
Heka:mazila開源的日志處理系統(tǒng)
Cbfs:couchbase開源的分布式文件系統(tǒng)
Tsuru:開源的PAAS平臺,和SAE實現(xiàn)的功能一模一樣
Groupcache:memcahe作者寫的用于Google下載系統(tǒng)的緩存系統(tǒng)
God:類似redis的緩存系統(tǒng),但是支持分布式和擴展性
Gor:網(wǎng)絡(luò)流量抓包和重放工具
