1. 程式人生 > >Go語言入門-《Go語言實戰》學習筆記

Go語言入門-《Go語言實戰》學習筆記

學習資料

安裝

環境變數配置

  • 在/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

鎖住共享資源

  1. 原子函式
  2. 互斥鎖
  3. 通道

第7章 併發模式

  • runner
  • pool
  • work