文章目录
【len】内建函数len返回 v 的长度
func len(v Type) int
内建函数len返回 v 的长度,这取决于具体类型:
数组:v中元素的数量
数组指针:*v中元素的数量(v为nil时panic)
切片、映射:v中元素的数量;若v为nil,len(v)即为零
字符串:v中字节的数量
通道:通道缓存中队列(未读取)元素的数量;若v为 nil,len(v)即为零
【new】内建函数new分配内存
func new(Type) *Type
其第一个实参为类型,而非值。
其返回值为指向该类型的新分配的零值的指针。
案例演示:
package main
import "fmt"
func main() {
var ptr = new(int)
fmt.Printf("变量ptr的类型:%T\n", ptr)
fmt.Printf("变量ptr的值:%v\n", ptr)
fmt.Printf("变量ptr的值(这个值是一个地址)所指向内存的值:%v\n", *ptr)
fmt.Printf("变量ptr的地址:%v\n", &ptr)
}
/*结果:
变量ptr的类型:*int
变量ptr的值:0xc00000e098
变量ptr的值(这个值是一个地址)所指向内存的值:0
变量ptr的地址:0xc000006028
*/
上述案例的内存示意图:
【make】内建函数make分配并初始化一个类型为切片、映射、或通道的对象
func make(Type, size IntegerType) Type
其第一个实参为类型,而非值。
make的返回类型与其参数相同,而非指向它的指针。
其具体结果取决于具体的类型:
切片:size指定了其长度。该切片的容量等于其长度。切片支持第二个整数实参可用来指定不同的容量;它必须不小于其长度,因此 make([]int, 0, 10) 会分配一个长度为0,容量为10的切片。
映射:初始分配的创建取决于size,但产生的映射长度为0。size可以省略,这种情况下就会分配一个小的起始大小。
通道:通道的缓存根据指定的缓存容量初始化。若 size为零或被省略,该信道即为无缓存的。
【recover】内建函数recover允许程序管理恐慌过程中的Go程
func recover() interface{}
在defer的函数中,执行recover调用会取回传至panic调用的错误值,恢复正常执行,停止恐慌过程。
若recover在defer的函数之外被调用,它将不会停止恐慌过程序列。
在此情况下,或当该Go程不在恐慌过程中时,或提供给panic的实参为nil时,recover就会返回nil。
案例演示:
package main
import "fmt"
func test() {
// defer 中的表达式必须为函数调用
defer func() {
if err := recover(); err != nil {
fmt.Println("捕获错误=>", err)
} else {
fmt.Println("没有错误=>", err)
}
}()
var a, b = 10, 0
var res = a / b
fmt.Println("a / b =", res)
}
func main() {
test()
fmt.Println("程序继续执行")
}
/*结果:
捕获错误=> runtime error: integer divide by zero
程序继续执行
*/
【panic】内建函数panic停止当前Go程的正常执行
func panic(v interface{})
当函数F调用panic时,F的正常执行就会立刻停止。
F中defer的所有函数先入后出执行后,F返回给其调用者G。
G如同F一样行动,层层返回,直到该Go程中所有函数都按相反的顺序停止执行。
之后,程序被终止,而错误情况会被报告,包括引发该恐慌的实参值,此终止序列称为恐慌过程。
自定义错误
errors
包:
func New(text string) error
使用字符串创建一个错误,请类比fmt包的Errorf方法,差不多可以认为是New(fmt.Sprintf(...))。
案例演示:
package main
import (
"errors"
"fmt"
)
func readName(name string) error {
if name == "张三" {
return nil
} else {
// 自定义错误信息,errors.New()是error类型
return errors.New("你的姓名不对")
}
}
func test() {
var err = readName("李四")
if err != nil {
// 当函数test调用panic时,test的正常执行就会立刻停止
panic(err)
}
fmt.Println("test函数继续执行")
}
func main() {
test()
fmt.Println("main函数继续执行")
}
结果:
【cap】内建函数cap返回 v 的容量
func cap(v Type) int
内建函数cap返回 v 的容量,这取决于具体类型:
数组:v中元素的数量,与 len(v) 相同
数组指针:*v中元素的数量,与len(v) 相同
切片:切片的容量(底层数组的长度);若 v为nil,cap(v) 即为零
信道:按照元素的单元,相应信道缓存的容量;若v为nil,cap(v)即为零
【append】内建函数append将元素追加到切片的末尾
func append(slice []Type, elems ...Type) []Type
若它有足够的容量,其目标就会重新切片以容纳新的元素。否则,就会分配一个新的基本数组。
append返回更新后的切片,因此必须存储追加后的结果。
slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)
作为特例,可以向一个字节切片append字符串,如下:
slice = append([]byte("hello "), "world"...)
【copy】内建函数copy将元素从来源切片复制到目标切片中,也能将字节从字符串复制到字节切片中
func copy(dst, src []Type) int
copy返回被复制的元素数量,它会是 len(src) 和 len(dst) 中较小的那个。
来源和目标的底层内存可以重叠。
版权声明:本文为gty204625782原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。