-
Notifications
You must be signed in to change notification settings - Fork 226
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
c01/c01_05 #31
Comments
因为切片类型为指向类型,实际指向的是数组 |
关于切片的说法的错误,
这里面使用[...]int{1,2,3) 创建出来根本不是slice 类型, 可以自己测试一下, slice的创建语法一般是下面2种
|
cap 容量为4 |
// 切片的好处还包括长度可变,解包后容量的变化不太明白
sliceN := []int{1}
fmt.Printf("sliceN(%d) 的长度为:%d,容量为:%d\n", sliceN, len(sliceN), cap(sliceN))
sliceN = append(sliceN, 2)
// 长度和容量自动变长
fmt.Printf("sliceN(%d) 的长度为:%d,容量为:%d\n", sliceN, len(sliceN), cap(sliceN))
// 可追加多个元素
sliceN = append(sliceN, 3, 4)
fmt.Printf("sliceN(%d) 的长度为:%d,容量为:%d\n", sliceN, len(sliceN), cap(sliceN))
// 可追加一个切片, ... 表示解包,不能省略
sliceN = append(sliceN, []int{7, 8}...)
fmt.Printf("sliceN(%d) 的长度为:%d,容量为:%d\n", sliceN, len(sliceN), cap(sliceN))
// 在第一个位置插入元素,以第一个元素为主体,后面的元素被解包
sliceN = append([]int{0}, sliceN...)
fmt.Printf("sliceN(%d) 的长度为:%d,容量为:%d\n", sliceN, len(sliceN), cap(sliceN))
// 在中间插入一个切片(两个元素)
sliceN = append(sliceN[:5], append([]int{5, 6}, sliceN[5:]...)...)
fmt.Printf("sliceN(%d) 的长度为:%d,容量为:%d\n", sliceN, len(sliceN), cap(sliceN)) 请问容量是怎么被计算的?是不是按2^n增加? sliceN([1]) 的长度为:1,容量为:1
sliceN([1 2]) 的长度为:2,容量为:2
sliceN([1 2 3 4]) 的长度为:4,容量为:4
sliceN([1 2 3 4 7 8]) 的长度为:6,容量为:8
sliceN([0 1 2 3 4 7 8]) 的长度为:7,容量为:8
sliceN([0 1 2 3 4 5 6 7 8]) 的长度为:9,容量为:16 |
切片里面是指针、长度、容量,由于容量是4,所以访问第四个元素不会报错,因为是指向数组第四位的指针,所以第四个元素的值是8 |
slice类型是数组的一个引用,数组arr的地址0x83029,那么slice的数据结构是[ ptr | len| cap],ptr就是指向数组arr的,就是一个指针,即存放了地址0x83029,len存放了slice的长度,cap存放了slice的容量,但是这个容量是不可能超过arr的len的,所以这样看来slice是一个引用,存放的数据是在arr中,修改slice的数据,对应修改了数组的内容,所以 |
1.5 数据类型:数组与切片 — Go编程时光 1.0.0 documentation
https://golang.iswbm.com/c01/c01_05.html
The text was updated successfully, but these errors were encountered: