Go語言入門-《Go語言實戰》學習筆記
阿新 • • 發佈:2018-12-22
學習資料
安裝
環境變數配置
- 在/etc/profile檔案中新增
export PATH=$PATH:/usr/local/go/bin
- 執行命令立即生效
source /etc/profile
- 輸入命令檢視配置是否成功
go
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 安裝成功後,執行
brew install go-delve/delve/delve
Visual Studio Code外掛安裝
設定代理
首選項-設定
http.proxy
需要安裝的外掛,會自動在右下角彈出提示,具體外掛如下
Installing 9 tools at /Users/mac/go/bin
gocode
gopkgs
go-outline
go-symbols
guru
gorename
godef
goreturns
golint
開發工具
終端設定代理
$ export http_proxy=http://proxyAddress:port
$ export ALL_PROXY=socks5://127.0.0.1:1080
Go語言簡介
第3章打包和工具鏈
3.1包
- 同一個目錄下的所有.go檔案必須宣告同一個包名
3.1.2 main包
- 在Go語言裡,命名為main的包具有特殊的含義。Go語言的編譯程式會試圖把這種名字的包編譯為二進位制可執行檔案。main()函式是程式的入口,程式編譯時,會使用宣告main包的程式碼所在的目錄的目錄名作為二進位制可執行檔案的檔名。
- 使用“遠端匯入”時,請確保您的網路暢通無阻。
import (
// 遠端匯入
"github.com/goinaction/code/chapter2/sample/search"
)
3.2.2 命名匯入
- 匯入的多個包具有相同的名字,可以使用命名匯入:在import語句給出的包路徑的左側定義一個名字,將匯入的包命名為新名字。
package main
import (
"fmt"
myfmt "mylib/fmt"
)
- 當你匯入了一個不在程式碼裡使用的包時,Go編譯器會編譯失敗,並輸出一個錯誤。目的是避免程式碼變的臃腫。
- 有時,使用者可能需要匯入一個包,但是不需要引用這個包的識別符號。在這種情況,可以使用空白識別符號_來重新命名這個匯入。
空識別符號
下劃線字元(_)在Go語言有很多用法。用來拋棄不想繼續使用的值,如給匯入的包賦予一個空名字,或者忽略函式返回的你不興趣的值。
3.3 函式init
- 每個包可以包含任意多個init函式,會在main函式之前執行。
func init() {
// 執行操作
}
3.4 使用Go的工具
- 使用命令執行編譯和清理工作
go build
go clean
3.5.1 go vet
- 檢測程式碼的常見錯誤
3.7.2 對gb的介紹
- 依賴管理
- gb工程會區分開發人員寫的程式碼和開發人員需要依賴的程式碼。
- gb工程與Go官方工具鏈(包括go get)並不相容。因為gb不需要設定GOPATH,而Go工具鏈無法理解gb工程的目錄結構。
第4章 陣列、切片和對映
陣列
- 由於陣列佔用的記憶體是連續分配的,CPU能把正在使用的資料快取更久的時間。
宣告和初始化
- 在Go語言中宣告變數時,總和使用對應型別的零值來對變數進行初始化。
// 宣告一個包含5個元素的整型陣列
var array [5]int
// 宣告一個包含5個元素的整型陣列
// 用具體值初始化每個元素
array := [5]int{10, 20, 30, 40, 50}
- 如果使用…代替陣列的長度,Go語言會根據初始化時陣列元素的數量來確定該陣列的長度。
// 宣告一個整型陣列
// 用具體值初始化每個元素
// 容量由初始化值的數量決定
array := [...] int{10, 20, 30, 40, 50}
// 宣告一個有5個元素的陣列
// 用具體值初始化索引為1和2的元素
// 其餘元素保持零值
array := [5]int{1: 10, 2: 20}
切片
- 切片是圍繞動態陣列的概念構建的,可以按需自動增長和縮小。
建立和初始化
1. 使用make函式建立切片,需要傳入一個引數,指定切片的長度。
- 如果只指定長度,那麼切片的容量和長度相等。也可以分別指定長度和容量。
// 建立一個字串切片
// 其長度和容量都是5個元素
slice := make([] string, 5)
- 分別指定長度和容量時,建立的切片,底層陣列的長度是指定的容量,但是初始化後並不能訪問所有的陣列元素。
// 建立一個整型切片
// 期長度為3個元素,容量為5個元素
slice := make([] int, 3, 5)
2. 使用切片字面量建立切片,這種方法和建立陣列類似,只是不需要指定[]運算子裡的值。初始的長度和容量會基於初始化時提供的元素的個數確定。
// 建立字串切片
// 期長度和容量都是5個元素
slice := [] string {"Red", "Blue", "Green", "Yellow", "Pink"}
- 可以設定初始長度和容量:在初始化時給出所需的長度和容量作為索引。
// 建立字串切片
// 使用空字串初始化第100個元素
slice := [] string{99: ""}
- 如果在[]運算子裡指定了一個值,那麼建立的就是陣列而不是切片。
對映
- Map資料結構
第5章 Go語言的型別系統
定義型別的方法
使用struct關鍵字
// user在程式裡定義一個使用者型別
type user struct{
name string
email string
ext int
privileged bool
}
// 宣告user型別的變數,並初始化所有欄位
lisa := admin{
name: "Lisa",
email: "[email protected]",
ext: 123,
privileged: true,
}
// 也可以這樣
// 宣告user型別的變數
lisa := user{"Lisa", "[email protected]", 123, true}
零值
- 數值型:0
- 字串:空字串
- 布林型別:false
第6章 併發
併發與並行的概念
- 併發(concurrency)不是並行(parallelism)。並行是讓不同的程式碼片段同時在不同的物理處理器上執行。並行的關鍵是同時做很多事情,而併發是指同時管理很多事情,這些事情可能只做了一半就被暫停去做別的事情了。
goroutine
- 一個執行緒可以建立多個goroutine
鎖住共享資源
- 原子函式
- 互斥鎖
- 通道
第7章 併發模式
- runner
- pool
- work