1.1 Go語言從入門到精通:Go語言介紹


作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。 








目錄

1、Go介紹
    1.1 Go的起源
    1.2 Go的特點(diǎn)
    1.3 Go的用途
    1.4 Go的美貌
2、為什么我們要學(xué)習(xí)Go?

1、Go介紹

Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

“Go是一種開源的程序設(shè)計語言,它意在使得人們能夠方便地構(gòu)建簡單、可靠、高效的軟件?!保▉碜訥o官網(wǎng)golang.org的定義)

Go語言,又稱為Golang,在2007年9月形成構(gòu)思,并于2009年11月發(fā)布,其發(fā)明人是Google的Robert Griesemer, Rob Pike和Ken Thompson。該語言其及配套工具集使得編譯和執(zhí)行既富有表達(dá)力又高效,而且使得程序員能夠輕松寫出可靠、健壯的程序。

Go的吉祥物是金花鼠(gordon),并將其作為logo,

Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發(fā)布了Go 1穩(wěn)定版本?,F(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且擁有一個活躍的社區(qū)。
1.1 Go的起源

編程語言的演化跟生物物種的演化類似,成功的語言會繁衍后代,這些后代語言會從它們的祖先那里汲取各種優(yōu)點(diǎn)。有時候,語言間的“混血”會產(chǎn)生異常強(qiáng)大的力量;在一些罕見情況下,某個重大的語言特性也可能憑空出現(xiàn)而無先例。通過觀察語言間的影響,我們可以學(xué)到不少知識,比如語言為什么會變成這個樣子,以及它適合用于哪些環(huán)境等等。

下圖展示了有哪些早期的編程語言對Go語言的設(shè)計產(chǎn)生了重要影響。

在這里插入圖片描述






Go有時會稱為“類C語言”,或者是“21世紀(jì)的C語言”。從C中,Go繼承了相似的表達(dá)式語法、控制流結(jié)構(gòu)、基本數(shù)據(jù)類型、按值調(diào)用的形參傳遞和指針,但比這些更重要的是,繼承了C所強(qiáng)調(diào)的要點(diǎn):程序要編譯成高效的機(jī)器碼,并自然地與所處的操作系統(tǒng)提供的抽象機(jī)制相配合。

但是在Go語言的家族樹中還有其它的祖先。其中一個有影響力的分支來自Niklaus Wirth所設(shè)計的Pascal語言。然后Modula-2語言激發(fā)了包的概念。然后Oberon語言摒棄了模塊接口文件和模塊實現(xiàn)文件之間的區(qū)別。第二代的Oberon-2語言直接影響了包的導(dǎo)入和聲明的語法,還有Oberon語言的面向?qū)ο筇匦运峁┑姆椒ǖ穆暶髡Z法等。

Go語言的另一支祖先,帶來了Go語言區(qū)別其他語言的重要特性,靈感來自于貝爾實驗室的Tony Hoare于1978年發(fā)表的鮮為外界所知的關(guān)于并發(fā)研究的基礎(chǔ)文獻(xiàn) 順序通信進(jìn)程 ( communicating sequential processes ,縮寫為CSP。在CSP中,程序是一組中間沒有共享狀態(tài)的平行運(yùn)行的處理過程,它們之間使用管道進(jìn)行通信和控制同步。不過Tony Hoare的CSP只是一個用于描述并發(fā)性基本概念的描述語言,并不是一個可以編寫可執(zhí)行程序的通用編程語言。

接下來,Rob Pike和其他人開始不斷嘗試將CSP引入實際的編程語言中。他們第一次嘗試引入CSP特性的編程語言叫Squeak(老鼠間交流的語言),是一個提供鼠標(biāo)和鍵盤事件處理的編程語言,它的管道是靜態(tài)創(chuàng)建的。然后是改進(jìn)版的Newsqueak語言,提供了類似C語言語句和表達(dá)式的語法和類似Pascal語言的推導(dǎo)語法。Newsqueak是一個帶垃圾回收的純函數(shù)式語言,它再次針對鍵盤、鼠標(biāo)和窗口事件管理。但是在Newsqueak語言中管道是動態(tài)創(chuàng)建的,屬于第一類值, 可以保存到變量中。

在Plan9操作系統(tǒng)中,這些優(yōu)秀的想法被吸收到了一個叫Alef的編程語言中。Alef試圖將Newsqueak語言改造為系統(tǒng)編程語言,但是因為缺少垃圾回收機(jī)制而導(dǎo)致并發(fā)編程很痛苦。(譯注:在Alef之后還有一個叫Limbo的編程語言,Go語言從其中借鑒了很多特性。 具體請參考Pike的講稿:http://talks.golang.org/2012/concurrency.slide#9 )

Go語言的其他的一些特性零散地來自于其他一些編程語言;比如iota語法是從APL語言借鑒,詞法作用域與嵌套函數(shù)來自于Scheme語言(和其他很多語言)。當(dāng)然,我們也可以從Go中發(fā)現(xiàn)很多創(chuàng)新的設(shè)計。比如Go語言的切片為動態(tài)數(shù)組提供了有效的隨機(jī)存取的性能,這可能會讓人聯(lián)想到鏈表的底層的共享機(jī)制。還有Go語言新發(fā)明的defer語句。
1.2 Go的特點(diǎn)

簡潔、快速、安全
并行、有趣、開源
內(nèi)存管理、數(shù)組安全、編譯迅速

1.3 Go的用途

其它語言能夠?qū)崿F(xiàn)的系統(tǒng),Go語言都能實現(xiàn)。

目前,Go主要應(yīng)用在下面這些系統(tǒng):

服務(wù)器編程,以前你如果使用C或者C++做的那些事情,用Go來做很合適,例如處理日志、數(shù)據(jù)打包、虛擬機(jī)處理、文件系統(tǒng)等。

分布式系統(tǒng)、數(shù)據(jù)庫代理器等,比如Etcd。

網(wǎng)絡(luò)編程,這一塊目前應(yīng)用最廣,包括Web應(yīng)用、API應(yīng)用、下載應(yīng)用,而且Go內(nèi)置的net/http包基本上把我們平常用到的網(wǎng)絡(luò)功能都實現(xiàn)了。

數(shù)據(jù)庫,前一段時間Google開發(fā)的Groupcache,Couchbase的部分組件,Tidb,Cockroachdb,Influxdb等。

云平臺,目前國外很多云平臺在采用Go開發(fā),CloudFoundy的部分組建,前VMare的技術(shù)總監(jiān)自己出來搞的Apcera云平臺。

云原生技術(shù),比如docker、Kubernetes等。

1.4 Go的美貌

說了這么多,Go 程序到底長啥樣?我們先睹為快,一看美貌!

來來來,以hello.go為例看看它長啥樣。(Go 語言源文件的擴(kuò)展是 .go)

package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}

2、為什么我們要學(xué)習(xí)Go?

就我而言,目前主要從事微服務(wù)方面的產(chǎn)品研發(fā),之前一直使用Java語言作為核心編程語言,但隨著市場的變化,Java有時變得力不從心(一些輕量級的功能模塊實現(xiàn)時,Java卻顯得有些笨重)。此外,為迎接云原生技術(shù)的到來,學(xué)習(xí)Go成為了必然。

對于你而言,為什么要學(xué)習(xí)Go呢?下面我參考知乎和網(wǎng)上大神的答案,談?wù)凣o語言的優(yōu)勢。

Go 語言特色
    簡潔、快速、安全
    并行、有趣、開源
    內(nèi)存管理、數(shù)組安全、編譯迅速

Go 語言用途

Go 語言被設(shè)計成一門應(yīng)用于搭載 Web 服務(wù)器,存儲集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語言。

對于高性能分布式系統(tǒng)領(lǐng)域而言,Go 語言無疑比大多數(shù)其它語言有著更高的開發(fā)效率。它提供了海量并行的支持,這對于游戲服務(wù)端的開發(fā)而言是再好不過了。

C/C++的問題

開發(fā)效率低,對開發(fā)者要求高;libc只向后兼容,運(yùn)維難度偏大。

Lua/Python的問題

動態(tài)語言,缺少編譯過程,低級錯誤頻出;缺少有效的性能分析及調(diào)試工具。