每當我學習新語言時,我總是感到愛恨交加。一方面來說,程式語言對於我們的工作是如此重要,即使一個微小的改變都會造成巨大的影響。當某個突然頓悟的時刻來臨時,總是會對你的程式產生長遠的影響,並且重新定義你對其他語言的期待。另一方面,語言的設計是持續的過程,學習新的關鍵字、型別系統、程式撰寫風格、新的函式庫、新的社群和範例。和其他的事物相比,學習新的語言總是讓我們感覺投資報酬率不高。
換句話說,我們必須採取積極的態度來面對。我們需要透過漸進的步驟來學習,畢竟,語言是一切的基礎。即使這些改變經常是持續的過程,他代表了這影響了生產力、可讀性、效能、測試、相依管理、錯誤處理、文件、效能分析、社群、標準函式庫等。難道我們可以說千刀萬剮是死刑的積極方法嗎?
因此,我們產生一個重要的問題:為什麼要學 Go?對我而言,有兩個重要的理由。第一,Go 是一個具有相對簡單標準函式庫的語言。從很多方面來看,Go 嘗試去簡化在過去幾十年中語言不斷進化所產生的複雜度。第二,對於許多開發者而言,Go 會補齊你現有的武器庫。
Go 被設計成一種系統程式語言(例如:作業系統、驅動程式),因此,他是針對 C/C++ 的開發者所設計。但根據 Go 的核心開發團隊,同時我也可以很肯定地說,應用程式開發者已經變成 Go 語言主要的使用者,而並非系統開發者。為什麼?我無法代表系統開發者來發表太多意見,但對於想要建構網站、服務、桌面應用程式等應用的開發者來說,Go 滿足了這一類介於底層應用與高階應用之間的需求。
也許這一類的需求是訊息傳遞、快取、計算量龐大的資料分析、命令列應用、日誌或監控。我不知道該給 Go 什麼樣的標籤,但是在我的職業生涯中,隨著系統越來越複雜,同時會有成千上萬種並行處理的方式,很顯然的,客製化基礎平台的需求越來越多。你可以使用 Ruby 或 Python 來建置(許多人也這麼做),但是這些系統將受惠於更嚴格的型別系統和更好的效能。同樣的,你也可以用 Go 來建置網站(也有許多人這樣做),但話說回來,我更喜歡用 Node 或 Ruby 來做這些事情。
還有許多其他的領域是 Go 擅長的,例如,Go 編譯過後的程式不會有任何的相依性,你不需要擔心使用者安裝 Ruby 或 JVM,甚至是什麼版本。也基於這個因素,Go 在命令列程式的應用和其他工具類的應用(例如:日誌搜集)上越來越熱門。
坦白說,學習 Go 語言讓你的時間變得更有效率。你不需要花費大量的時間或者嘗試掌握 Go,在這個過程中,你會透過付出得到許多實用的東西。
基於幾個理由,我很猶豫是否要寫下這本書。第一,Go 官方的文件已經很完整了,特別是 Effective Go 這份檔案。
另外一個理由是在寫語言類的書籍我會感到不安。當我寫 Little MongoDB 這本書時,我可以很安心的假設大多數的讀者了解關聯式資料庫和模型等相關的基礎。當我寫 Little Redis 這本書時,我也可以假設讀者瞭解 key value 的儲存方式。
我想想這些章節和段落,可能無法做這些假設。你花了許多時間學習 interface,這是一個新的概念。最後,考量到這本書帶給你的價值,如果你讓我知道哪些章節太詳細或太粗淺的話,我會感到相當開心。