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之后的代码会被跳过。