內置函數
內置函數可以直接使用,且不需要導入特定的package
close
: 主要用來關閉channellen
: 用來求長度,比如sting
,array
,slice
,map
,channel
new
: 用來分配內存,主要用來分配值類型,比如int
,struct
等基本類型,返回的是指針(注意!!)make
: 用來分配內存,主要用來分配引用類型,比如channel
,map
,slice
等append
:用來追加元素到slice
中panic
和recover
: 用來作錯誤處理
new
通常用來分配值類型的數據
返回的是指針
聲明
1 | 變量 := new(類型) |
比較
1 | package main |
[1] 一般聲明值類型的方式,返回的是值
[2] 使用new
來定義一個int
類型的指針
[3] 使用*
對指向地址裡儲存的值賦值
result1
2
3i = 0
j = 0xc042060088 //[1]
*j = 100
[1] j
變量為一指針類型
make
通常用來分配引用類型
比如channel
,map
,slice
new 與 make的區別
1 | package main |
result
1 | &[] |
可以看到new返回的是指針類型,指向一個空切片的地址
make直接返回的就是切片,而不是指針
append
用來追加元素到slice
中
append函數的第二參數為可變參數,可追加一個值或多個值
追加一個值
1 | var a []int |
result1
a = [1]
追加多個值
1 | var a []int |
result1
a = [1 3 5 7 9]
追加一個slice中的元素
1 | var a []int = []int{1,2,3,} |
[1] 使用...
將b
切片展開追加到a
切片中
result1
a = [1 2 3 11 22 33]
panic & recover
panic 錯誤處裡
程序執行時遇到某些極端情況,無法繼續執行,可拋出panic
異常
且Go本身就有自帶一些已知panic異常,可快速發現問題
- 且通常拋出
panic
且未捕獲的狀態下,程序會停止運行
系統自拋 panic
1 | package main |
[1] b
變量應是無解值
result1
2
3
4
5panic: runtime error: integer divide by zero //[1]
goroutine 1 [running]:
main.main()
D:/GoWork/test.go:7 +0x11 //[2]
[1] 拋出panic
異常並跟隨原因
[2] 並顯示於第7行語句發生異常
主動拋出 panic
遇到一些代碼可正常執行,但邏輯錯誤,可自己主動拋出異常
模擬配置文件載入出錯
模擬配置文件讀取失敗,但是程序仍能正常運行,屬邏輯錯誤
設計者應主動拋出panic
1 | package main |
[1] 返回err
變量,其為error
類型(保存錯誤訊息)
[2] errors.New
初始化一個error
類型的自訂義錯誤訊息實例
[3] 主動調用panic
函數,參數為錯誤信息
result1
2
3
4
5
6
7panic: initConfig Failed!!
goroutine 1 [running]:
main.panic_test()
D:/GoWork/test.go:15 +0x9f
main.main()
D:/GoWork/test.go:20 +0x27
- panic錯誤訊息為自訂義之訊息,並明指了發生錯誤的行數
recover 捕獲異常
- 有時程序上線時,即使發生異常,也不希望程序退出
- 發生的錯誤並不是致命性的
- 發生錯誤並不影響程序繼續運行,或是不影響下一次請求
基於以上原因,希望能藉由捕獲異常(記錄日誌),以防止程序崩潰或停擺
搭配 defer 及 匿名函數
1 | package main |
[1] 使用defer
於函數發生panic
要退出函數時,搭配匿名函數捕獲異常
[2] 如發生異常,調用recover
函數捕獲,並將獲取的panic
信息賦值給err
變量
[3] 匿名函數聲明時即調用需再聲明完畢}
左邊加上()
調用並填入參數
result1
2
3
4
5
6
7Error: runtime error: integer divide by zero
Error: runtime error: integer divide by zero
Error: runtime error: integer divide by zero
Error: runtime error: integer divide by zero
Error: runtime error: integer divide by zero
...
...
從結果可發現程序不斷地在發出panic
,但是沒有退出程序