Go 部落格

Go:一年前的今天

Andrew Gerrand
2010 年 11 月 10 日

2009 年 11 月 10 日,我們啟動了 Go 專案:一種專注於簡潔與效率的開源程式語言。這段期間見證了 Go 專案本身及其社群的許多重大發展。

我們著手建構一種用於系統程式設計的語言,像是用 C 或 C++ 編寫的典型程式,而 Go 作為通用語言的實用性讓我們感到驚訝。我們預期會獲得 C、C++ 和 Java 程式設計師的興趣,但來自 Python 和 JavaScript 等動態型別語言使用者的熱烈興趣卻出乎我們意料之外。Go 結合了原生編譯、靜態型別、記憶體管理和輕量級語法,似乎吸引了程式設計社群的廣泛族群。

該橫切面已成長為一群熱情的 Go 編碼人員的專門社群。我們的 郵件清單 已有超過 3,800 位會員,每月約有 1,500 則貼文。此專案有超過 130 位貢獻者(提交程式碼或文件的人員),而自推出以來的 2,800 則提交中,有將近三分之一是由核心團隊以外的程式設計師提供的。為了將所有程式碼整理成形,我們的 開發郵件清單 中交換了將近 14,000 封電子郵件。

這些數字反映了專案的程式碼庫中顯而易見的成果。編譯器已大幅改善,提供更快速且有效率的程式碼產生、修正超過一百個已回報的錯誤,並支援範圍更廣泛的作業系統和架構。在致力貢獻的小組(其中一位成員成為我們這個專案中首位非 Google 的提交者)的努力下,Windows 移植版本即將完成。ARM 移植版本也取得了顯著的進展,最近達到了通過所有測試的里程碑。

Go 工具組已擴充並加以改善。Go 文件工具 godoc 現可支援其他程式碼樹的文件編寫(您可以瀏覽和搜尋自己的程式碼),並提供一個 “程式碼漫步” 介面,用於提供教學素材(還有許多其他的改善)。Goinstall 是個新的套件管理工具,讓使用者可以使用單一命令安裝和更新外部套件。Go 美化列印程式 Gofmt 現在可以在可能的情況下進行語法簡化。Goplay 是一個基於網路的“邊打字邊編譯”工具,可以在您無法使用 Go Playground 時,便利地使用 Go 來進行實驗。

標準函式庫已經增加超過 42,000 行的程式碼,並包含 20 個新的 套件。新增的內容包括 jpegjsonrpcmimenetchansmtp 套件,以及一堆新的 密碼編譯 套件。更一般地說,隨著我們對 Go 習慣用法的了解更深入,標準函式庫也持續在改進和修訂當中。

除錯的故事也有所改善。最近對 gc 編譯器的 DWARF 輸出的改進有助於讓 GNU 除錯工具 GDB 可用於 Go 二進位檔案,而且我們正在積極地努力讓這些除錯資訊更加完整。(詳情請參閱 最近的部落格文章

現在,連結到以 Go 以外的語言所寫現有函式庫比以往更容易。Go 支援已包含在最新版的 SWIG 版本 2.0.1 中,這讓連結到 C 和 C++ 程式碼更容易,而且我們的 cgo 工具已修正了許多錯誤並改善很多方面。

Gccgo,GNU C 編譯器的 Go 前端,已跟上 gc 編譯器作為平行 Go 實作腳步。它現在有一個可用的垃圾收集器,並已被納入 GCC 核心。我們現在正努力使 gofrontend 可用為 BSD 許可的 Go 編譯器前端,完全與 GCC 分離。

在 Go 專案外部,Go 已開始用於建立真正的軟體。我們的 專案資訊面板 上已列出逾 200 個 Go 程式和函式庫,還有數百個在 Google CodeGitHub 上。在我們的郵寄清單和 IRC 頻道上,你可以找到來自世界各地,使用 Go 從事其程式設計專案的程式設計人員。(請參閱我們上個月的 客座網誌文章,取得實際範例。)在 Google 內部,有數個團隊選擇 Go 來建構生產軟體,我們已收到來自開發 Go 大型系統的其它公司的報告。我們也與幾位教育工作者保持聯繫,他們正使用 Go 作為教學語言。

這門語言本身也已成長且成熟。在過去的一年,我們收到許多功能要求。但是 Go 是一種小的語言,且我們努力確保任何新功能都能在簡潔性和實用性之間取得適當的折衷。在推出之後,我們已對語言做出許多變更,其中許多是受來自社群的回饋所驅動的。

  • 在幾乎所有情況下,分號現在都是可選的。 規範
  • 內建新函式 `copy` 和 `append` 使切片管理更有效率且更直接。 規範
  • 在製作子切片時,上界和下界可以省略。這代表 `s[:]` 是 `s[0:len(s)]` 的簡寫。 規範
  • 內建新函式 `recover` 可補完 `panic` 和 `defer` 作為錯誤處理機制。 網誌, 規範
  • 新的複數型別(`complex`、`complex64` 和 `complex128`)簡化了特定數學運算。 規範, 規範
  • 組合文字語法允許省略多餘的型別資訊(舉例來說,在指定二維陣列時)。 版本.2010-10-27, 規範
  • 現在指定變數函式引數(`...T`)及其傳播(`v...`)的一般語法。 規範, 規範, 版本.2010-09-29

Go 肯定已為生產用途做好準備,但仍有可改進的空間。在近期,我們的重心在於讓 Go 程式在高性能系統的背景下更快速也更有效率。這意味著要改進垃圾回收、最佳化產生的程式碼,以及改善核心函式庫。我們也在探索對型別系統額外進行一些增補,讓泛型程式更容易撰寫。一年來已經發生了許多事;既讓人興奮,也令人滿足。我們希望今年會比去年更豐碩。

如果你曾經想加入 [回來] Go,現在正是好時機!請查看 文件 入門 頁面,取得更多資訊,或是在 Go Playground 中盡情發揮創意。

下一篇文章:Go Slices:用法和內部
上一篇文章:除錯 Go 程式碼(狀態報告)
部落格索引