欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Go语言-----内置函数

程序员文章站 2022-07-15 09:15:52
...

Go 语言中内置了一些函数,可以直接使用,不必以包名导入

append

go语言中的append函数作用是在切片变量的后面追加新的数据,然后返回新的切片变量

func append(slice []Type, elems ...Type) []type

slice为需要追加的源切片,elems为可变参数列表,返回值为追加后的切片
在调用此函数时,通常需要以slice接收追加后的返回切片,否则slice仍为追加前的数据

copy

copy函数把slice源的数据复制到目的切片中,需要注意的是,copy不会主动的扩展目的切片的容量,在目的slice填充满之后会舍弃超出的部分,返回的是复制成功的元素个数

	func copy(dst, src [] Type) int

若目的slice原来有元素,则会被覆盖掉

delete

delete函数用于删除map中对应key的键值对,如果map中不存在该key,则什么也不做

	func delete(m map[Type]Type1, key Type)

len

len函数用来获取字符串,切片,数组,通道,字典类型变量的内容长度,不同的类型,长度的计算规则不一致。对于切片,字典,数组,通道类型的变量,他们中的每一个元素就是一个长度。string类型的变量,每一个字节都是一个长度,中文字在utf8编码中占三个字节,故len获取string类型长度时,每一个汉字都是三个长度。

	func len(v Type) int

len计算的是变量已有数据的内容长度,并非是变量的容量。
如果v是nil,则len(v)为0

cap

cap函数用来计算切片,通道,数组类型变量的容量,即这个容器最多能装多少元素。

	func cap(v Type) int

如果v是nil,则cap(v) 容量获取到的是0

new

new函数用来创建某一个类型的指针型对象,理论上,只要一个数据类型能够被访问到,就能用new函数来创建指针类型的对象。返回值是一个指向新分配的type类型的零值的指针。

func new(Type) *Type

在Go语言中,如果使用new创建chan类型的指针对象,在使用之前仍然需要使用make函数来初始化chan的容量

new函数创建对象与直接使用struct{}创建的对象的区别是,前者为指向对象的一个指针,后者创建的是对象引用本身。

make

make函数也用于内存分配,和new不同的地方在于,make函数只能用于chan,map和切片三种类型的创建,返回值就是对象本身,因为这三类数据结构本身就是引用类型,必须要初始化

	func make(t Type, size ...IntegerType) Type

初始化slice

	// 初始化切片,第二个参数数字为初始化零值的个数,即size,第三个数字为预留的容量
	// 打印结果为:[0 0 0 0 0], 切片size:5, 切片容量:10 
	a := make([]int, 5, 10)
	fmt.Printf("%v, 切片size:%d, 切片容量:%d \n", a, len(a), cap(a))

	// 初始化切片,若参数列表只跟一个数字,则该切片的初始化零值个数和切片的容量均由该数字设定
	// 打印结果为:[0 0 0 0 0], 切片size:5, 切片容量:5 
	b := make([]int, 5)
	fmt.Printf("%v, 切片size:%d, 切片容量:%d \n", b, len(b), cap(b))
	
	// 不使用make创建切片,则切片的size和初始容量均为创建时赋值的个数
	// 打印结果为:[1 2], 切片size:2, 切片容量:2
	c := []int{1, 2}
	fmt.Printf("%v, 切片size:%d, 切片容量:%d \n", c, len(c), cap(c))

初始化map

	// 创建一个初始容量为5的map,map不能使用cap来查看容量,map的最大容量跟计算机的内存有关
	a := make(map[int]int, 5)

初始化chan通道

	// 创建一个带有缓冲区的chan通道,带缓冲区的chan
	// 可以在通道未装满且没有协程读取通道内值的时候,可以继续向通道内写入
	// 打印结果为:size = 1, cap = 10 
	a := make(chan int, 10)
	a <- 1
	fmt.Printf("size = %d, cap = %d \n", len(a), cap(a))
	
	// 创建一个无缓冲区的chan通道,当无其他协程读取通道内值的时候,主协程会阻塞
	// 打印结果为:size = 0, cap = 0 
	b := make(chan int)
	fmt.Printf("size = %d, cap = %d \n", len(b), cap(b))