golang學習筆記1:初識
1、為什麼要學習go?
隨著軟體規模的不斷擴大,諸多的學者和谷歌的開發者們在公司內部的軟體開發過程中開始經歷大量的挫折,在諸多問題上都不能給出令人滿意的解決方案,尤其是在使用 C++ 來開發大型的服務端軟體時,情況更是不容樂觀。由於二進位制檔案一般都是非常巨大的,因此需要耗費大量的時間在編譯這些檔案上,同時程式語言的設計思想也已經非常陳舊,這些情況都充分證明了現有的程式語言已不符合時下的生產環境。儘管硬體在過去的幾十年中有了飛速的發展,但人們依舊沒有找到機會去改變 C++ 在軟體開發的重要地位,並在實際開發過程中忍受著它所帶來的令人頭疼的一些問題。因此學者們坐下來總結出了現在生產環境與軟體開發之間的主要矛盾,並嘗試設計一門全新的程式語言來解決這些問題。
以下就是他們討論得出的對程式語言的設計要求:
能夠以更快的速度開發軟體
開發出的軟體能夠很好地在現代的多核計算機上工作
開發出的軟體能夠很好地在網路環境下工作
使人們能夠享受軟體開發的過程
Go 語言就在這樣的環境下誕生了,它讓人感覺像是 Python 或 Ruby 這樣的動態語言,但卻又擁有像 C 或者 Java 這類語言的高效能和安全性。
Go 語言出現的目的是希望在程式設計領域創造最實用的方式來進行軟體開發。它並不是要用奇怪的語法和晦澀難懂的概念來從根本上推翻已有的程式語言,而是建立並改善了 C、Java、C# 中的許多語法風格。它提倡通過介面來針對面向物件程式設計,通過 goroutine 和 channel 來支援併發和並行程式設計。
2、go語言概述
2007 年 9 月 21 日:雛形設計
2009 年 11 月 10日:首次公開發布
2010 年 1 月 8 日:當選 2009 年年度語言
2010 年 5 月:谷歌投入使用
2011 年 5 月 5 日:Google App Engine 支援 Go 語言
從 2010 年 5 月起,谷歌開始將 Go 語言投入到後端基礎設施的實際開發中,例如開發用於管理後端複雜環境的專案。有句話叫 “吃你自己的狗食”,這也體現了谷歌確實想要投資這門語言,並認為它是有生產價值的。
Go 語言的官方網站是 golang.org,這個站點採用 Python 作為前端,並且使用 Go 語言自帶的工具 godoc 執行在 Google App Engine 上來作為 Web 伺服器提供文字內容。在官網的首頁有一個功能叫做 Go Playground,是一個 Go 程式碼的簡單編輯器的沙盒,它可以在沒有安裝 Go 語言的情況下在你的瀏覽器中編譯並執行 Go,它提供了一些示例,其中包括國際慣例 “Hello, World!”。
Go 語言中另一個非常重要的特性就是它的構建速度(編譯和連結到機器程式碼的速度),一般情況下構建一個程式的時間只需要數百毫秒到幾秒。作為大量使用 C++ 來構建基礎設施的谷歌來說,無疑從根本上擺脫了 C++ 在構建速度上非常不理想的噩夢。這不僅極大地提升了開發者的生產力,同時也使得軟體開發過程中的程式碼測試環節更加緊湊,而不必浪費大量的時間在等待程式的構建上。
Go 語言從本質上(程式和結構方面)來實現併發程式設計。
因為 Go 語言沒有類和繼承的概念,所以它和 Java 或 C++ 看起來並不相同。但是它通過介面(interface)的概念來實現多型性。Go 語言有一個清晰易懂的輕量級型別系統,在型別之間也沒有層級之說。因此可以說這是一門混合型的語言。
在傳統的面嚮物件語言中,使用面向物件程式設計技術顯得非常臃腫,它們總是通過複雜的模式來構建龐大的型別層級,這違背了程式語言應該提升生產力的宗旨。
Go 語言使用靜態型別,所以它是型別安全的一門語言,加上通過構建到原生代碼,程式的執行速度也非常快。
作為強型別語言,隱式的型別轉換是不被允許的,記住一條原則:讓所有的東西都是顯式的。
Go 語言其實也有一些動態語言的特性(通過關鍵字var),所以它對那些逃離 Java 和 .Net 世界而使用 Python、Ruby、PHP 和 JavaScript 的開發者們也具有很大的吸引力。
Go 語言支援交叉編譯,比如說你可以在執行 Linux 系統的計算機上開發執行下 Windows 下執行的應用程式。這是第一門完全支援 UTF-8 的程式語言,這不僅體現在它可以處理使用 UTF-8 編碼的字串,就連它的原始碼檔案格式都是使用的 UTF-8 編碼。Go 語言做到了真正的國際化!
Go 語言被設計成一門應用於搭載 Web 伺服器,儲存叢集或類似用途的巨型中央伺服器的系統程式語言。對於高效能分散式系統領域而言,Go 語言無疑比大多數其它語言有著更高的開發效率。它提供了海量並行的支援,這對於遊戲服務端的開發而言是再好不過了。
Go 語言一個非常好的目標就是實現所謂的複雜事件處理(CEP),這項技術要求海量並行支援,高度的抽象化和高效能。當我們進入到物聯網時代,CEP 必然會成為人們關注的焦點。
但是 Go 語言同時也是一門可以用於實現一般目標的語言,例如對於文字的處理,前端展現,甚至像使用指令碼一樣使用它。
值得注意的是,因為垃圾回收和自動記憶體分配的原因,Go 語言不適合用來開發對實時性要求很高的軟體。
3、Hello Go
Go 語言原始檔的副檔名很顯然就是 .go
在下載頁面 https://golang.org/dl/ 選擇適合你作業系統的安裝包下載並安裝。
在完成安裝包的安裝之後,你只需要配置 $GOROOT 這一個環境變數就可以開始使用 Go 語言進行開發了,其它的環境變數安裝包均會進行自動設定。在預設情況下,Go 將會被安裝在目錄 c:\go 下,但如果你在安裝過程中修改安裝目錄,則可能需要手動修改所有的環境變數的值。
如果你想要測試安裝,則可以在命令列使用指令 go run 執行hello.go
package main import "fmt" func main() {fmt.Printf("hello, world\n")}
如果發生錯誤 fatal error: can’t find import: fmt 則說明你的環境變數沒有配置正確。
安裝目錄清單
你的 Go 安裝目錄($GOROOT)的資料夾結構應該如下所示:
/bin:包含可執行檔案,如:編譯器,Go 工具
/doc:包含示例程式,程式碼工具,本地文件等
/lib:包含文件模版
/misc:包含與支援 Go 編輯器有關的配置檔案以及 cgo 的示例
/os_arch:包含標準庫的包的物件檔案(.a)
/src:包含原始碼構建指令碼和標準庫的包的完整原始碼(Go 是一門開源語言)
/src/cmd:包含 Go 和 C 的編譯器和命令列指令碼
Go 執行時(runtime)
儘管 Go 編譯器產生的是本地可執行程式碼,這些程式碼仍舊執行在 Go 的 runtime(這部分的程式碼可以在 runtime 包中找到)當中。這個 runtime 類似 Java 和 .NET 語言所用到的虛擬機器,它負責管理包括記憶體分配、垃圾回收、棧處理、goroutine、channel、切片(slice)、map 和反射(reflection)等等。
runtime 主要由 C 語言編寫 ,並且是每個 Go 包的最頂級包。你可以在目錄 $GOROOT/src/runtime 中找到相關內容。
垃圾回收器Go 擁有簡單卻高效的標記-清除回收器。它的主要思想來源於 IBM 的可複用垃圾回收器,旨在打造一個高效、低延遲的併發回收器。使用一門具有垃圾回收功能的程式語言不代表你可以避免記憶體分配所帶來的問題,分配和回收內容都是消耗 CPU 資源的一種行為。
Go 的可執行檔案都比相對應的原始碼檔案要大很多,這恰恰說明了 Go 的 runtime 嵌入到了每一個可執行檔案當中。當然,在部署到數量巨大的叢集時,較大的檔案體積也是比較頭疼的問題。但總得來說,Go 的部署工作還是要比 Java 和 Python 輕鬆得多。因為 Go 不需要依賴任何其它檔案,它只需要一個單獨的檔案,這樣你也不會像使用其它語言一樣在各種不同版本的依賴檔案之間混淆。
Go 直譯器
因為 Go 具有像動態語言那樣快速編譯的能力,自然而然地就有人會問 Go 語言能否在 REPL(read-eval-print loop)程式設計環境下實現。Sebastien Binet 已經使用這種環境實現了一個 Go 直譯器,你可以在這個頁面找到:
https://github.com/sbinet/igo。

關注置頂走一波~