1、切片的底层是一个数组,但是切片传递是地址传递
2、切片不是数据类型,而是一个数据结构
3、slice通常写成[]T,其中元素的类型都是T;它看上去像没有长度的数组
4、slice有三个属性:指针、长度和容量
5、一个底层数组可以对应多个slice,这些slice可以引用数组的任意位置,彼此之间的元素还可以重叠
package main
import "fmt"
func main() {
//[low:high:max] len()=high-low cap=max-low
a := []int{1, 2, 3, 4, 5}
fmt.Println("len(a):", len(a), "cap(a):", cap(a))
b := a[1:2:4]
fmt.Println("len(b):", len(b), "cap(b):", cap(b)) //len(b): 1 cap(b): 3
//[:high:max]
c := a[:2:3]
fmt.Println("len(c):", len(c), "cap(c):", cap(c))
fmt.Println(c[1]) //[1 2],容量是3,但是可以添加值,这个地址没有值
//fmt.Println(c[1])// index out of range
//[low::max]
// d :=a[2::5]//middle index required in 3-index slice,及不能缺少中间参数
// fmt.Println("len(d):", len(d), "cap(d):", cap(d))
//[low:]
d := a[2:]
fmt.Println("len(d):", len(d), "cap(d):", cap(d)) //len(d): 3 cap(d): 3
//[:high] 这时的cap是整个底层数组的大小
e := a[:2]
fmt.Println("len(e):", len(e), "cap(e):", cap(e)) //len(e): 2 cap(e): 5
e = append(e, 3) //在e切片后面追加3
s1 := a[1:3] //s1: [2 3]
fmt.Println("s1:", s1)
s2 := s1[1:4] //s2: [3 4 5] 由此可以看出,切片都是操作的底层数组,不是一个部分切片
fmt.Println("s2:", s2)
s2[2] = 66 //把底层数组也改变了
fmt.Println("a:", a) //a: [1 2 3 4 66]
“
}
运行结果:
原文:https://www.cnblogs.com/zhaopp/p/11439799.html