Go 程式設計教學:簡介

Go 語言,也稱為 Golang,是一個靜態型別的 (statically-typed) 通用型 (general-purpose) 編譯 (compiled) 程式語言,由 Google 公同主導開發。Go 最早於 2009 年問世,對於程式語言來說,算是相當年輕,但 Go 已經吸引許多來自全世界的開發者的目光;Ruby 創造者松本行弘曾說過,一個程式語言生態圈至少要十年才能有成,但 Go 在短短不到十年間於程式語言排名中已名列前矛,像是獲得 TIOBE 2016 年最佳語言等。雖然國內對於 Go 的專書尚少,但國外已經有相當多的學習資料。筆者將於這個系列的文章中介紹 Go 語言。

Go 語言的核心開發者 Rob Pike 曾撰文介紹 Go 設計的理念,讀者可以到這裡看一看;總而言之,Go 的誕生,是為了解決實務的工程議題,而非設計出一個在語法機制上很漂亮的語言。Go 語言有以下的特性:

  • 開放原始碼 (open source)
  • 靜態型別的編譯語言;但語法類似腳本語言 (scripting language)
  • 跨平台 (cross-platform)
  • 內建全自動垃圾回收 (garbage collection),可手動調整
  • 內建平行處理 (concurrency) 的語法
  • 內建函式程式設計 (functional programming)
  • 輕量級物件 (object) 系統
  • 程式風格強制統一
  • 快速編譯
  • 內建開發相關工具
  • 豐富的標準函式庫
  • 成長中的社群資源

對於沒有程式設計經驗的讀者可能會難以理解這些特色,筆者將於本文中說明:

Go 語言本身是開放原始碼的專案,若使用者想了解 Go 如何運作,可以直接觀看 Go 的原始碼;甚至,可以自行修改原始碼,若修改的部分被 Go 核心團隊接受,有機會可以對 Go 本身做出貢獻。而且,Go 本身是以相對友善的 BSD 條款發布,即使是商業軟體,也可以放心地使用 Go。

Go 是靜態型別的編譯語言,對於程式設計者來說,這類的語言有軟體工程上的優點,像是可以預先進行語法、型別檢查,對於追蹤錯誤更加方便,編譯語言的效能也會比直譯語言佳。比起傳統的編譯語言,像是 C 或 C++ 或 Java,Go 的語法相對簡單許多;雖然比起真正的腳本語言,像是 Python 或 Ruby 等,程式碼會稍微長一點,但考量 Go 是編譯語言,這樣的語法已經算是相當簡潔。

Go 程式碼是跨平台的,不需要像 C 或 C++ 般撰寫很多條件編譯來達成跨平台的程式碼;另外,也不需要像 Java 或 C# 般,需要額外的運行環境 (runtime environment),而可以直接發布二進位檔。當然,受限於底層的作業系統,不是所有的 Go 程式碼都可以跨平台,像是圖形使用者介面或是繪圖就需要搭配相關的 C/C++ 函式庫才能順利運作;使用 Go 標準函式庫和大部分的第三方函式庫的 Go 專案,都可以原封不動地移到另一個平台上編譯和使用。

為了簡化開發流程,Go 採用全自動的垃圾回收;這對 Go 來說是兩面刃,對於高效能或是即時運算的 (real-time) 程式,垃圾回收會阻礙程式的運作需求。由於這項特性,Go 不像其一開始宣稱的,如同 C 或 C++ 的系統程式語言 (system programming language),反而比較像是 Java 或 C# 般的應用程式語言 (application programming language)。

由於現在的電腦硬體已經朝向多核心、多處理器、分散式運算等方向發展,但大部分現行的主流語言在發展時沒有將這些因素考慮進去,而 Go 在語法機制即內建對於共時性 (concurrency) 的支援,使得撰寫共時性程式更加簡單。

早期 C 和 C++ 在發展時,並沒有一致的開發工具 (tool chain),像是在 Windows 系統和類 Unix 系統上的工具並不一致,造成開發時的不便。而 Go 在一開始,即內建數個開發工具,包括編譯器 (compiler)、套件管理 (package management)、程式碼重排 (syntax formatting)、語法檢查 (syntax checking) 等,這些工具沒有綁定特定的 IDE 或編輯器 (editor),開發者可自由選用自己喜歡的工作環境。

只有語言和編譯器本身,無法很快地寫出應用程式,而 Go 還有一套豐富的標準函式庫,可以減少使用者重造輪子,專注在核心功能上;像是 Go 可以在不依賴網頁框架 (web framework) 的情形下,即可使用大部分網頁程式 (web application) 所有的功能;許多 Gophers (Go 程式設計師) 不用任何網頁框架,僅用標準函式庫加上一些第三方套件來撰寫網頁程式。雖然 Go 目前的社群資源不若 Java 或 Python 般豐富,但也有許多開發者投入 Go 套件的開發,使 Go 社群更加茁壯。

另外,還有一些和語言特性相關的特點,筆者將於後續的文章中介紹。經過這些介紹,相信讀者開始對 Go 產生興趣了,在下一篇文章中,我們會介紹使用 Go 的考量點,讓讀者決定是否要在下一個專案中使用 Go。

comments powered by Disqus