golang的slice你真的搞懂了吗

golang slice


先看一个简单的代码块

package main

import (
	"fmt"
)

func main() {
	//case 1
	a := []int{}
	a = append(a, 1)
	a = append(a, 2)
	b := append(a, 3)
	c := append(a, 4)
	fmt.Println("a: ", a, "\nb: ", b, "\nc: ", c)
	
	//case 2
	a = append(a, 3)
	x := append(a, 4)
	y := append(a, 5)
	fmt.Println("a: ", a, "\nx: ", x, "\ny: ", y)
	
}

输出的结果如下

a:  [1 2] 
b:  [1 2 3] 
c:  [1 2 4]
a:  [1 2 3] 
x:  [1 2 3 5] 
y:  [1 2 3 5]

其他的都是输出都是常规操作,可能很多人对这个x的输出感到诧异,为什么是1 2 3 5,而不是 1 2 3 4.这是因为,他们都是切片,切片底层公用一个数组。x和y都是指针,指向同一个底层数组。
当在操作b和c时候,由于超过了数组的slice的cap容量,会触发扩容操作,所以b和c分别指向了两个不同的新数组。而当x和y追加操作时,并未触发新数组创建,x和y指向同一个底层数组,所以在
x追加操作时,返回的任然是a的指针,len是4和a的容量4。
y追加操作时,返回的任然是a的指针,len是4和a的容量4。

发布了215 篇原创文章 · 获赞 103 · 访问量 461万+

猜你喜欢

转载自blog.csdn.net/u010278923/article/details/87093383