1. 程式人生 > >go 內建函式

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之後的程式碼會被跳過。