Introduction
語言本身的特性
- Go是為軟體工程服務而設計的語言
- 現代程式語言最大特徵之一是混合了多種典範
- 在Go中,可以看到C的struct,Java的interface,函數式的典型特徵一級函式等特徵。
- 實際上,Go不是物件導向語言,沒有物件,沒有繼承,然而在精神的實現上,使用了struct作為資料與邏輯的聯結(就實現方式上,感覺又有點像Python了),以組合、has-a的關係來消弭程式碼重複的問題,就操作上,又滿像是物件導向語言了。
- 因應多核處理器普及,並行(Concurrency)程式設計的支援是現代語言的目標,Go就直接在語法上支援並行程式設計,只要在函式前放一個go關鍵字,就可以建立可與其他函式並行運作的goroutine,之間的通訊,則透過channel來實現。
慣例方面的特性
- Workspaces開頭就提到,go工具一開始就是為了公開檔案庫(repositories)中的開放原始碼而設計,不管你是否發布程式碼,都得遵守它既定的環境設置規範,無從選擇。
- 原始碼必須放在
src
目錄(依package
放在各自子目錄),編譯出來的套件會放在pkg
目錄,執行檔就放在bin
中(也可以自定義GOBIN
環境變數),對於相依套件,也可以透過GOPATH
來管理。
工具與文件上的特性
-
談到工具,現代程式語言在工具的完備性上也有所重視,比方說最常見的是程式庫、套件等的管理,
- Ruby從1.9開始內建了RubyGems,
- Python 3.4之後預設就有pip可以使用,
- JavaScript,使用的是著名的npm套件管理器,
- Go可以透過內建的go get指令,來下載套件,go get可以支援svn、hg、git、bzr等檔案庫的安裝,只要有安裝相對應的版本控制程式。
-
多環境的版本控制
- Python中的virtualenv,從Python 3.4開始也開始內建,
- GOPATH的存在,在Go也可達到這類目的,或者是安裝第三方的gvp與搭配gpm(類似Python的pip),至於Go語言本身多版本的並存需求,則可透過gvm(類似Ruby的rvm)。
-
Go內建了測試機制,執行go test的話,會自動讀取套件目錄中的
*_test.go
來編譯、運行測試; -
在文件的支援上,有著godoc(或go doc)這樣的工具,可以直接查閱套件、函式等的文件說明,實際上,它們讀取了原始碼中的註解內容,概念上類似於Python的Docstring或者是Java的Javadoc,不過更為簡單,沒有特定的語言結構與標記,如同〈Godoc: documenting Go code〉談到的,目的是希望註解本身就是文件,即便在沒有godoc的情况下,也希望能從程式碼註解中直接獲得文件說明。