Golang基础——数据类型:切片

切片:

大小不确定的放在堆区(实际值),固定长度的在栈区(变量名:存地址)

添加切片数据的时候,地址可能发生改变,当前内存不能连续并且足够大。

扩容:<=1024 :两倍;> 1024 :每次扩容上一次的 1 / 4

引用传递
var a []int
a = append(a, 1, 2, 3, 4, 5)
fmt.Println(a)
fmt.Printf("%T
", a)
fmt.Println(len(a)) // 长度
fmt.Println(cap(a)) // 容量
var b = []int{1, 2, 3}
fmt.Println(b)
c := []int{1, 2, 3}
fmt.Println(c)
d := make([]int, 5, 10) // 长度 5,容量 10
fmt.Println(d)
fmt.Println(len(d))
fmt.Println(cap(d))
e := make([]int, 3)
fmt.Println(e)
e[0] = 111
fmt.Println(e)

切片截取固定长度:

s := []int{1,2,3,4,5}
s[0:3:5]  // 从0到3,取左不取右,s的容量为 5,容量不能超过原来的切片的容量
// 地址和原来的切片重合,是原来切片的一部分,还是原来的地址。所以修改切片的内容,会影响原来的。

切片拷贝:

	a := []int{1, 25, 5} // [1 25 5]
	var c []int
	b := make([]int, 1) 
	copy(b, a)          // 存储两个地址 a -> b
	copy(c, a)
	fmt.Println(a)
	fmt.Println(b) // 有几位填充几位  [1]
	fmt.Println(c) // []

切片当做函数参数,引用传递:

但是,append函数,向切片中添加数据时,地址将可能发生改变,不影响实参的地址。相当于,如果内存够用,就用原来的;不够用了,就新开辟内存地址。但是原来的实参切片还在原来的地址。

原文地址:https://www.cnblogs.com/pythonwl/p/14598933.html