go 筆記系列,旨在簡明扼要地概述學習的關鍵點,以便他日查證拾遺
-
工作區結構
- src pkg bin
- main.main() 函式(這個函式位於主包)是每一個獨立的可執行程式的入口點。
- 除了 main 包之外,其它的包最後都會生成 *.a 檔案(也就是包檔案)並放置在 GOPATH/pkg/GOPATH/pkg/GOOS_$GOARCH 中
- 用 var 方式來定義全域性變數,:= 進行在函式內的簡短宣告,_ 特殊的變數名,任何賦予它的值都會被丟棄。
- 字串使用""或``,其不可變,但可以進行切片操作;內建error錯誤型別;
- iota 列舉
-
宣告
import( "fmt" "os" ) const( i = 100 pi = 3.1415 prefix = "Go_" ) var( i int pi float32 prefix string )
-
iota列舉關鍵字與常量
- 預設開始值是 0,const 中每增加一行加 1
- 每遇到一個 const 關鍵字,iota 就會重置
- 常量宣告省略值時,預設和之前一個值的字面相同
- 在同一行值相同
-
golang變數可見性規則
- 大寫字母開頭的變數,公有變數,可匯出。小寫則是私有變數。
-
array, slice, map
- 宣告 slice 時,方括號內沒有任何字元。slice 的 index 只能是 int 型別
-
陣列之間的賦值是值的賦值,傳入的其實是該陣列的副本,而不是它的指標
//array var arr [10]int // 宣告瞭一個int型別的陣列 b := [10]int{1, 2, 3} // 宣告瞭一個長度為 10 的 int 陣列,其中前三個元素初始化為 1、2、3,其它預設為 0 c := [...]int{4, 5, 6} // 可以省略長度而採用 `...` 的方式,Go 會自動根據元素個數來計算長度 //slice, 和宣告 array 一樣,只是少了長度 var fslice []int // 宣告並初始化 slice := []byte {'a', 'b', 'c', 'd'} // a 指向陣列的第 3 個元素開始,併到第五個元素結束,左開右閉 a = ar[2:5] // 第三個引數指定切片容量 slice = array[2:4:7]
-
slice 引用型別 常用簡便操作
- slice 的預設開始位置是 0,ar[:n] 等價於 ar[0:n]
- slice 的第二個序列預設是陣列的長度,
ar[n:]
等價於ar[n:len(ar)]
- 如果從一個陣列裡面直接獲取 slice,可以這樣
ar[:]
,即等價於ar[0:len(ar)]
,包含了全部的元素
-
slice 常用內建函式
- len 獲取 slice 的長度
- cap 獲取 slice 的最大容量
- append 向 slice 裡面追加一個或者多個元素,然後返回一個和 slice 一樣型別的 slice
- copy 函式 copy 從源 slice 的 src 中複製元素到目標 dst,並且返回複製的元素的個數
-
map
var numbers map[string]int numbers = make(map[string]int) numbers["one"] = 1 // 賦值 rating := map[string]float32{"C":5, "Go":4.5, "Python":4.5, "C++":2 } // map 有兩個返回值,第二個返回值,如果不存在 key,那麼 ok 為 false,如果存在 ok 為 true csharpRating, ok := rating["C#"]
- 透過delete刪除map的元素
- map 也是一種引用型別,如果兩個 map 同時指向一個底層,那麼一個改變,另一個也相應的改變
- map 和其他基本型別不同,它不是 thread-safe,在多個 go-routine 存取時,必須使用 mutex lock 機制
-
make vs new
- new 用於各種型別的記憶體分配。new 返回指標,即*T型別的值
- make 用於內建型別(map、slice 和 channel)的記憶體分配。make 返回一個有初始值(非零)的T型別,而不是 *T
-
零值並非是指空值,而是一種變數未填充前的預設值,通常為0
// 常用零值列表 int 0 int8 0 int32 0 int64 0 uint 0x0 rune 0 // rune 的實際型別是 int32 byte 0x0 // byte 的實際型別是 uint8 float32 0 // 長度為 4 byte float64 0 // 長度為 8 byte bool false string "
本作品採用《CC 協議》,轉載必須註明作者和本文連結