常見的GO指令
go get
Go本身自己帶的管理工具,可以直接從github等站台獲取package。
常用參數
- -u 強制同步到repo最新的版本
- -d 跳過構建與安裝,單純複製一份repo到你的GOPATH
go env
顯示Go目前的環境參數
go fmt
依照Go標準風格格式化文件,目前在vscode裡面每次儲存就會調用這個功能了。
go mod
通常在開發Go的時候,都會習慣透過module的方式去管理專案本身的套件。
# init的風格主要看個人選擇
go mod init github.com/user_name/your_project
go mod init your_project
init完之後你會發現你專案內部出現一個新的檔案go.mod
module github.com/user_name/your_project
go 1.16
關鍵字
Go的關鍵字總共有25個
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
變數型別與宣告
布林
跟其他語言大同小異,true or false,預設值為false
整數
類型 | 儲存空間 | 範圍 |
---|---|---|
uint8 | 8-bit | 0~255 |
uint16 | 16-bit | 0 ~65535 |
uint32 | 32-bit | 0 ~ 4294967295 |
unit64 | 64-bit | 0 ~ 18446744073709551615 |
int8 | 8-bit | -128 ~ 127 |
int16 | 16-bit | -32768 ~ 32767 |
int32 | 32-bit | -2147483648 ~ 2147483647 |
int64 | 64-bit | -9223372036854775808 ~ 9223372036854775807 |
浮點數
Go的浮點數類型有兩種
- float32,預設情況下精準到小數點第7位。
- float64,預設情況下精準到小數點第15位。
字符(Byte)
根據官方定義,Byte等同於unit8。
Byte可以定義slice,[]byte也可以轉換成string。
bytes := []byte{}
str := string(bytes)
字串(string)
字串在Go的世界裡是用雙引號或單引號做定義,預設為"“空值。
Go語言的字符串都採用『utf-8』編碼。
要注意字串是不可修改的,如果遇到需要修改的情況的話可以使用slice或者轉成[]byte,來達到一樣的需求。
錯誤
Go和C語言一樣都採用了返回值作為錯誤處理的方式,與C不同的地方是Go並不是回傳一個整數類型作為判斷依據,而是實現了一個錯誤類型。
err返回值除了nil以外都代表發生錯誤。
宣告
// 第一種方式
var name (int, bool, string)
// 第一種方式宣告多個變數
var name, name1, name2
# 第二種方式
name := value
// 第二種方式同時多個變數並賦予值
name1, name2 := value1, value2
// 第三種方式
var (
a = 15
b = false
str = "Hello World"
numShips = 50
city string
)
!注意,『 := 』宣告同時賦值的語法,只有在func內部使用。
指針(Point)
每個變數都有一個記憶體位置儲存該數據類型的值,指針的值可以用來儲存任何一個變數的記億體位址。
- 在32位機器上占用4個byte。
- 在64位機器上占用8個byte。
- 當指針被宣告後沒有賦值時,預設為nil。
// 宣告num1並給予1
num1 := 1
// 宣告num2並存num1的記憶體位置
num2 := &num1
// num1_address, num2_address, 1
fmt.Println(num2, &num2, *num2)
// 宣告num3為int point去指到num1
var num3 *int = num1
// num1_address, num3_address, 1
fmt.Println(num3, &num3, *num3)
垃圾回收機制(Garbage Collection,簡稱GC)
Go的GC演化過程如下:
- v1.1 STW
- v1.3 Mark STW, Sweep 并行
- v1.5 三色標記法 (Go目前用這種)
- v1.8 hybrid write barrier
效能優化
- 少用string裡面的 +。
- 小對象儘量重覆使用,局部變數少宣告,多個小對象可以放到struct裡頭。