1. 程式人生 > >Go語言學習筆記(一) 簡介、安裝

Go語言學習筆記(一) 簡介、安裝

為什麼選擇Go

程式語言已經非常多,偏效能敏感的編譯型語言有 C、C++、Java、C#、Delphi和Objective-C等,偏快速業務開發的動態解析型語言有PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特定領域的語言有Erlang、R和MATLAB等,那麼我們為什麼需要 Go這樣一門新語言呢?

Go語言官方自稱,之所以開發Go 語言,是因為“近10年來開發程式之難讓我們有點沮喪”。這一定位暗示了Go語言希望取代C和Java的地位,成為最流行的通用開發語言。

Go希望成為網際網路時代的C語言。多數系統級語言(包括Java和C#)的根本程式設計哲學來源於C++,將C++的面向物件進一步發揚光大。但是Go語言的設計者卻有不同的看法,他們認為C++ 真的沒啥好學的,值得學習的是C語言。C語言經久不衰的根源是它足夠簡單。因此,Go語言也要足夠簡單!

單機時代的語言可以只關心問題本身的解決,但是隨著工程規模的不斷擴大,軟體複雜度的不斷增加,軟體工程也成為語言設計層面要考慮的重要課題。多數軟體需要一個團隊共同去完成,在團隊協作的過程中,人們需要建立統一的互動語言來降低溝通的成本。規範化體現在多個層面,如:

  • 程式碼風格規範
  • 錯誤處理規範
  • 包管理
  • 契約規範(介面)
  • 單元測試規範
  • 功能開發的流程規範

Go語言很可能是第一個將程式碼風格強制統一的語言,例如Go語言要求public的變數必須以大寫字母開頭,private變數則以小寫字母開頭,這種做法不僅免除了public、private關鍵字,更重要的是統一了命名風格。

計算機軟體經歷了數十年的發展,形成了多種學術流派,有面向過程程式設計、面向物件程式設計、函數語言程式設計、面向訊息程式設計等,這些思想究竟孰優孰劣,眾說紛紜。

C語言是純過程式的,這和它產生的歷史背景有關。Java語言則是激進的面向物件主義推崇者,典型表現是它不能容忍體系裡存在孤立的函式。而Go語言沒有去否認任何一方,而是用批判吸收的眼光,將所有程式設計思想做了一次梳理,融合眾家之長,但時刻警惕特性複雜化,極力維持語言特性的簡潔,力求小而精。

從程式設計正規化的角度來說,Go語言是變革派,而不是改良派。

語言簡史

提起Go語言的出身,我們就必須將我們飽含敬意的眼光投向持續推出驚世駭俗成果的貝爾實驗室。貝爾實驗室已經走出了多位諾貝爾獎獲得者,一些對於現在科技至關重要的研究成果,比如電晶體、通訊技術、數碼相機的感光元件CCD和光電池等都源自貝爾實驗室。該實驗室在科技界的地位可想而之,是一個毫無爭議的科研聖地。

這裡我們重點介紹一下貝爾實驗室中一個叫計算科學研究中心的部門對於作業系統和程式語言的貢獻。回溯至1969年,肯·湯普遜(Ken Thompson)和丹尼斯·裡奇(Dennis Ritchie)在貝爾實驗室的計算科學研究中心裡開發出了Unix這個大名鼎鼎的作業系統,還因為開發Unix而衍生出了一門同樣赫赫有名的程式語言——C語言。對於很大一部分人而言,Unix就是作業系統的鼻祖,C語言也是計算機課程中最廣泛使用的程式語言。Unix和C語言在過去的幾十年以來已經造就了無數的成功商業故事,比如曾在90年代如日中天的太陽微系統(Sun MicroSystems),現在正如日中天的蘋果的Mac OS X作業系統其實也可以認為是Unix的一個變種(FreeBSD)。在之後的幾十年中,該研究專案又演變出了另一個叫Inferno的專案分支,以及一個名為Limbo的程式語言。Limbo是用於開發執行在小型計算機上的分散式應用的程式語言,它支援模組化程式設計,編譯期和執行時的強型別檢查,程序內基於具有型別的通訊通道,原子性垃圾收集和簡單的抽象資料型別。它被設計為:即便是在沒有硬體記憶體保護的小型裝置上,也能安全執行。

Limbo語言被認為是Go語言的前身,不僅僅因為是同一批人設計的語言,而是Go語言確實從Limbo語言中繼承了眾多優秀的特性。貝爾實驗室後來經歷了多次的動盪,包括肯·湯普遜在內的Plan 9專案原班人馬加入了Google。在Google,他們創造了Go語言。早在2007年9月,Go語言還是這幫大牛的20%自由時間的實驗專案。到了2008年5月,Google發現了Go語言的巨大潛力,從而開始全力支援這個專案,讓這批人可以全身心投入Go語言的設計和開發工作中。Go語言的第一個版本在2009年11月正式對外發布,並在此後的兩年內快速迭代,發展迅猛。第一個正式版本的Go語言於2012年3月28日正式釋出,讓Go語言迎來了第一個引人矚目的里程碑。

基於Google對開源的一貫擁抱態度,Go語言也自然而然地選擇了開源方式釋出,並使用BSD授權協議。任何人可以檢視Go語言的所有原始碼,並可以為Go語言發展而奉獻自己的力量。

語言特性

自動垃圾回收:到目前為止,記憶體洩露的最佳解決方案是在語言級別引入自動垃圾回收演算法(GarbageCollection,簡稱GC)。

更豐富的內建型別:Go語言內建了一個對於其他靜態型別語言通常用庫方式支援的字典型別(map)。新增的資料型別:陣列切片(Slice)。我們可以認為陣列切片是一種可動態增長而且不限制資料型別的陣列。

函式多返回值:Go語言革命性地在靜態開發語言陣營中率先提供了多返回值功能。

錯誤處理:Go語言引入了3個關鍵字用於標準的錯誤處理流程,這3個關鍵字分別為defer、panic和recover。

匿名函式和閉包:在Go語言中,所有的函式也是值型別,可以作為引數傳遞。Go語言支援常規的匿名函式和閉包。

型別和介面:Go語言並沒有直接沿襲C++和Java的傳統去設計一個超級複雜的型別系統,不支援繼承和過載,而只是支援了最基本的型別組合功能。它還引入了一個無比強大的“非侵入式”介面的概念,即型別和介面不緊密繫結。

併發程式設計:Go語言引入了goroutine概念,是一種比執行緒更加輕盈、更省資源的協程。通過使用goroutine而不是裸用作業系統的併發機制,以及使用訊息傳遞來共享記憶體而不是使用共享記憶體來通訊,Go語言讓併發程式設計變得更加輕盈和安全。

反射:Go語言的反射實現了反射的大部分功能,但沒有像Java語言那樣內建型別工廠,故而無法做到像Java那樣通過型別字串建立物件例項。

語言互動性:由於Go語言與C語言之間的天生聯絡,可以按Cgo的特定語法混合編寫C語言程式碼,然後Cgo工具可以將這些混合的C程式碼提取並生成對於C功能的呼叫包裝程式碼。開發者基本上可以完全忽略這個Go語言和C語言的邊界是如何跨越的。

安裝Go

下載地址:Go下載地址

一鍵安裝就好,而且環境變數都給配置好了。

IDE的選擇,作為一個JetBrains的粉絲,自從用過idea之後就再也回不去eclipse了,自然要使用JetBrainsGoLand。

IDE下載地址

啟用碼