Golang的append函数

Golang的append函数_第1张图片

发现问题

Golang的append函数_第2张图片

golang的append函数

func append

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

内建函数append将元素追加到切片的末尾。若它有足够的容量,其目标就会重新切片以容纳新的元素。否则,就会分配一个新的基本数组。append返回更新后的切片,因此必须存储追加后的结果。

slice = append(slice, elem1, elem2)
slice = append(slice, anotherSlice...)

作为特例,可以向一个字节切片append字符串,如下:

slice = append([]byte("hello "), "world"...)

笔者推断append函数的底层应该是这样:

func add(x []int, y []int) []int{
	var z []int
	zlen :=len(x)+len(y)
	if zlen <= cap(x){
		z = x[:zlen]
		fmt.Println(z)//[2 3 4 5 6]
	}else{
		zcap := zlen // 将zlen赋值非zcap
		// 这儿相当于 将x的cap 扩容了一倍, 和原本的append函数一样
		if zcap	<= 2 * len(x) {
			zcap = 2*len(x)
		}
	// 初始化新切片,将原来的值复制过去
		z = make([]int,zlen,zcap)
		copy(z,x)
        fmt.Println(z)//[2,3,4,0,0,0]
	}
	j := 0
	for i := len(x);i < zlen;i++{
		if j < len(y){
			z[i] = y[j]
		}
		j += 1
	}
	return z

}

效果如下:

当新切片的长度小于等于原切片的容量时:

每次调用add函数,必须先检测slice底层数组是否有足够的容量来保存新添加的元素。如果有足够空间的话,直接扩展slice(依然在原有的底层数组之上),将新添加的y切片中的元素到新扩展的空间,并返回slice。因此,输入的x和输出的z共享相同的底层数组。

Golang的append函数_第3张图片

 当新切片的长度大于原切片的容量时:

如果没有足够的增长空间的话,appendInt函数则会先分配一个足够大的slice用于保存新的结果,先将输入的x复制到新的空间,然后添加y切片中的元素。结果z和输入的x引用的将是不同的底层数组。

Golang的append函数_第4张图片

你可能感兴趣的:(golang,开发语言,后端)