数组与切片的概念在其它语言中也有,之前我是没有搞明白他们之间的关系的。今天做了下总结
区别:数组是值类型,切片是引用类型,在使用的时候有区别。 如果用一个数组A创建新数组B的时候,需要将A中的所有元素全部复制一遍过去。如果是切片的话,就会指向原来的数据。
数组赋值拷贝见下面例子
func main() {
var a [10]int = [10]int{1, 2, 3}
b := a
b[0] = 2
fmt.Printf("%d,%d", (int)(a[0]), (int)(b[0]))
}
输出的结果 1,2
创建过程也不同:
数组的创建使用 = []type{}创建,初始数据为0。
切片创建有两种,通过已经存在数组创建或者通过make创建
a := b[0:3]
a:= make([]int, 10, 20)
数组是静态不可变的,切片是动态长度可变的 make创建切片时候第三个参数就是该切片内存不够时候需要重新分配的粒度
func main() {
c := make([]int,3,5)
c = append(c,1,2,3,4)
for _, v := range c {
fmt.Printf("%d,",v)
}
fmt.Printf("\n新分配内存后切片容量%d", cap(c))
}
结果: 0,0,0,1,2,3,4,
新分配内存后切片大小10
package main
import "fmt"
func main() {
a := [...]int{3: 3}
fmt.Println(a)
b := append(a[:], 4, 5, 6)
fmt.Println(b, len(b), cap(b))
change1(b)
fmt.Println(b, len(b), cap(b))
b = change2(b)
fmt.Println(b, len(b), cap(b))
}
func change1(s []int) {
s = append(s, []int{7, 8, 9, 10}...)
fmt.Println("func change1:", s, len(s), cap(s))
}
func change2(s []int) []int {
s = append(s, []int{7, 8, 9, 10}...)
fmt.Println("func change2:", s, len(s), cap(s))
return s
}
输出:
- [0 0 0 3]
- [0 0 0 3 4 5 6] 7 8
- func change1: [0 0 0 3 4 5 6 7 8 9 10] 11 16
- [0 0 0 3 4 5 6] 7 8
- func change2: [0 0 0 3 4 5 6 7 8 9 10] 11 16
- [0 0 0 3 4 5 6 7 8 9 10] 11 16
#5
更多评论
有几个错误:
> 数组的创建使用 = []type{}创建
这种方式创建的是切片,创建数组必须指定长度,即[3]type{}这样的。
> 切片创建有两种
通过上面,自然[]type{}也是一种方式。
另外,代码最好自己编译成功过。如:```for i ,v in range c```,v定义了未使用等,我已帮修正了。
#1