go 內建函式
go 的內建函式不擁有前面提到的go的標準型別,因此內建函式不能作為一個函式值賦值給函式型別的變數。
close
close
用於關閉一個channel
,使用close函式要注意以下幾點:
- 關閉一個只接受的channel會導致錯誤
- 在一個已經關閉的channel上傳送資料會導致panic
- 關閉一個nil channel會導致panic
- 在一個channel關閉之後,如果channel已經沒有剩餘資料等待接受了,這時候如果繼續接收,會返回一個channel對應資料型別的nil value,如果接收的時候使用多返回值,第二個引數表示一個channel是否已經關閉。
len和cap
len和cap都接收多種型別的引數,返回值是int型別,具體接收哪些型別的引數以及返回的值的含義見下表
方法 | 引數 | 結果 |
---|---|---|
len(s) | string | 字串的位元組長度 |
[n]T *[n]T | 陣列的長度(==n) | |
[]T | slice的長度 | |
map[K][T] | map的長度,即有多少個key-value對 | |
chan T | 在channel裡面有多少個等待接收的元素 | |
cap(s) | [n]T *[n]T | 陣列長度(==n) |
[]T | slice的capacity(預分配空間) | |
chan T | channel的buffer的長度 |
len,cap的返回值滿足如下條件:
0<=len(s)<=cap(s)
slice,map,channel的nil值的len為0
slice,channel的nil值的cap為0
new
new函式的引數是一個型別,返回一個指向該型別的指標,並且進行0值初始化
call | type | result |
---|---|---|
make(T, n) | slice | 建立一個T型別的slice且長度為n |
make(T, n, m) | slice | 建立一個T型別的slice且長度為n,capacity位m |
make(T) | map | 建立一個T型別的map |
make(T, n) | map | 建立一個T型別的map,且預分配n個空間 |
make(T) | channel | 創一個channel |
make(T, n) | channel | 建立一個擁有n長度的buffer的channel |
m>=n,且n和m必須是整型且不能為負數。
make
make也根據不同引數型別和引數個數具有不同的含義,見下表
append
append(s S, x …T) S
在slice後面追加元素,返回一個新的slice,新的slice可能指向不同的underlying array,所以呼叫append的時候一定要將其返回值賦值給slice,保證得到append之後的slice。
s = append(s, a)
copy
copy(dst, src, []T) int
copy(dst []byte, src string) int
copy返回拷貝的長度,會自動取最短的長度進行拷貝(min(len(src), len(dst)))
delete
刪除一個map指定key的元素
delete(m, k)
panic,recover
panic(interface{})
直接呼叫panic或者是一個執行panic都會結束本次函式呼叫,函式中的defer將會被正常執行,panic如果不被recover將會導致程式崩潰
recover() interface{}
在defer的函式中呼叫recover,可以將呼叫defer的後面的函式體的panic恢復。
func protect(g func()) {
defer func() {
if x := recover(); x != nil {
fmt.Println("run time panic:%v"x)
}
}()
g()
}
上面的程式碼中,如果在函式g中發生panic,那麼recover將會返回panic的引數,如果panic的引數不是nil的話,則會將panic的引數輸出。並且這種情況下,程式將會繼續執行,只是g函式中panic之後的程式碼會被跳過。