介紹
Go語言是一種讓代碼分享更容易的程式設計語言。Go語言內建一些工具,讓使用別人寫的包更容易,並且分享自己寫的包更容易。
Go語言對並發的支援是這門語言最重要的特性之一。goroutine很像線程,但是它佔用的記憶體遠少於線程,使用它需要的代碼更少。通道(channel)是一種內建的資料結構,可以讓使用者在不同 的goroutine之間同步發送具有類型的訊息。
術語
goroutine 是可以與其他goroutine並存執行的函數,同時也會與主程式(程式的入口)並存執行。
個人理解: 相當於其他語言的多線程
channel 一種資料結構,可以讓goroutine之間進行安全的資料通訊。
可以避免像其他語言裡常見的共用記憶體訪問的問題。
鴨子類型 如果它叫起來像鴨子,那它就可能是只鴨子
規範
- 如果介面類型只包含一個方法,那麼這個類型的名字以
er
結尾
Go語言的類型系統
- 類型簡單
- Go介面對一組行為建模
空白標識符(_) 用來拋棄不想繼續使用的值,如給匯入的包賦予一個空名字,或者忽略函數返回的你不感興趣的值。
init函數 每個包可以包含任意多個init函數,所有被編譯器發現的init函數都在main函數之前執行。
文檔
命令列擷取
go doc fmt
瀏覽文檔
godoc -http=:6060
包含所有Go標準庫和你的GOPATH下Go原始碼的文檔
函數的文檔直接寫在函式宣告之前,使用人類可讀的句子編寫。如果想給包寫一段文字量比較大的文檔,可以在工程裡包含一個叫作doc.go的檔案,使用同樣的包名,並把包的介紹使用注釋加在包名聲明之前。
資料類型
參考型別 切片、map、channel(通道)、介面、函數, 當聲明上述類型的變數時,建立的變數被稱作 Header 值
數組 固定長度。用於儲存一段具有相同的類型的元素的連續塊
如果使用 ...
代替數組長度,則更具初始化時數組元素的數量來確定該數組的長度
// 聲明一個包含5個元素的整型數組var array [5]int// 用具體值初始化每個元素array := [5]int {1, 2, 3, 4, 5}// 容量由初始化值的數量決定array := [...]int {1, 2, 3, 4, 5}// 用具體值初始化索引為1,2 的元素,其餘則保持0array := [5]int {1: 1, 2: 2}
切片 動態數組,可以按需自動成長和縮小。
在64位架構機器上, 一個切片需要24位元組的記憶體: 指標欄位需要8位元組,長度和容量欄位分別需要8位元組。
// 建立一個字串切片,其長度和容量都是5個元素slice := make([]string, 5)// 長度為3個元素,容量為5個元素 不容許建立容量小雨長度的切片slice := make([]int, 3, 5)// 建立 nil 整型切片var slice []int
如果在 []
運算子中指定了一個值,那麼建立的就是數組而不是切片
//建立有3個元素的整型數組array := [3]int {10, 20, 30}//建立長度和容量都是3的整型切片slice := []int {10, 20, 30}
//建立一個整型切片,其長度和容量都是5個元素slice := []int{1,2,3,4,5}//建立一個新切片,其長度為2個元素,容量為4個元素newSlice := slice[1:3]
對於底層數組容量是k的切片 slice[i:j]
來說
長度: j - i
容量: k - i
切片增長
append
總是增加新切片的長度,而容量則有可能會改變,容量改變取決於被操作的切片的可用容量
建立切片時的第3個索引
第三個索引可以用來控制新切片的容量,其目的並不是要增加容量,而是要限制容量
slice[i:j:k]
長度 j - i
容量 k - i
迭代
range
返回兩個值。第一個值是 索引 第二個對應位置元素值的一份副本
map
儲存一系列無序索引值對
自訂類型
- 使用關鍵字struct建立一個結構類型
type User struct { ID string }
- 基於一個已有類型,將其作為新類型的類型說明
type Duration int64// int64類型叫作Duration的基礎類型。Go 並不認為 Duration 和 int64 是同一類型。這兩個類型是完全不同的有區別的類型。
struct
struct 有2中方法, 值方法和指標方法
- 值方法 調用時會使用這個值的一個副本來執行
指標方法 調用時使用這個值的引用來執行
也可以使用指標來調用值方法,編譯器轉換後的代碼
(*obj).method()
也可以使用值來調用引用方法,編譯器轉換後的代碼
(&ojb).method()
聲明一個方法時使用 值方法 還是 指標方法,取決於想得到一個新值還是想修改原有的值
介面
用來定義行為
channel
unbuffered := make(chan int) //無緩衝通道buffered := make(chan int, 10)
總結
- Go語言是現代的、快速的、帶有一個強大的標準庫。
- Go語言內建對並發的支援。
- Go語言使用介面作為代碼複用的基礎模組。
- 每個代碼檔案都屬於一個包,而包名英國與代碼檔案所在的檔案夾同名
- Go語言提供了多種聲明和初始設定變數的方式。如果變數的值沒有顯式初始化,編譯器會將變數初始化為零值。
- 使用指標可以在函數間活著goroutine間共用資料。
- 通過啟動goroutine和使用通道完成並發和同步
- Go語言提供了內建函數來支援Go語言內部的資料結構。
- Go語言中包是組織代碼的基本單位
- 環境變數GOPATH決定了Go原始碼在磁碟上被儲存、編譯和安裝的位置。
- 可以為悲歌工程設定不同的GOPATH,以保持原始碼和依賴的隔離。
- Go工具是在命令列上工作的最好工具
- 開發人員可以使用go get 來擷取別人的包並將其安裝到自己的GOPATH指定目錄
- 要為別人建立包很簡單,只要吧原始碼放到公用程式碼程式庫,並遵守一些簡單的規則就可以了。
- Go語言在設計時將分享代碼作為語言的核心特性和驅動力。
- 推薦使用依賴管理工具來管理依賴 如 godep, vender, gb
- 數組結構是切片和map的基石
- Go語言裡切片經常用來處理資料的集合,map用來處理具有簡直對結構的資料
- 內建函數make可以建立切片和map,並指定原始的長度和容量。也可以直接使用切片和map字面量,活著使用字面量的初始值。
- 切片有容量限制,不過可以使用內建的append函數擴充容量。
- map的增長沒有容量或者任何限制
- 內建函數len可以用來擷取切片或者map的長度
- 內建函數cap只能用於切片 (cap()函數返回的是數組切片分配的空間大小)
- 通過組合,可以建立多維組和多維切片。也可以使用切片或者其他map作為map的值。但是切片不能用作map的鍵
- 將切片或者map傳遞給函數成本很小,並且不會複製底層的數組結構。
- 使用關鍵字 struct 或者指定已經存在的類型,可以聲明使用者定義的類型。
- 方法提供了一種給使用者定義的類型增加行為的方式。
- 設計類型時需要去人類型的本質是原始的,還是非原始的。
- 介面是聲明了一組行為並支援多態的類型。
- 嵌入類型提供了擴充類型的能力,而無需使用繼承。
- 標識符要麼是從包裡公開的,要麼是在包裡未公開的。