var array [5]int
var array =[5]int{1001,1002,1003,1004,1005}
var array =[...]int{1001,1002,1003,1004,1005}
array:=[5]int{1,2,3,4,5}
以上定义出来的是数组
var slice []int
var slice []int = array[1:3]
var slice = []int{1,2,3}
slice := make([]int,3,5)
以上定义出来的是切片
1,定义的时候设置了长度,就是数组;未设置长度,就是切片。
2,截取操作返回的是切片;切片长度是截取的长度;切片容量是从截取位置开始一直到原数组或切片结束。
3,切片扩容超过原容量后,会重新创建一个底层数组,与原数组再无关联。
package main
import (
"fmt"
"reflect"
)
func main() {
//fmt.Println(test())
//test()
//testMap()
//testSlice()
testSlice2()
}
func test() (i int) {
defer func() { i++ }()
defer func() { fmt.Println(i) }()
//todo
//...
fmt.Println(0)
return 1
//defer执行时机
}
func testMap() (i int) {
var a map[string] int
a = make(map[string] int)
//var a = map[string] int{}
a["aaa"] = 1
fmt.Println(a)
i = a["aaa"]
fmt.Println(i)
return i
}
func testSlice() (i int) {
var a [] int
//a = make([]int,2)
a = []int{0}
a[0] = 2
fmt.Println(a)
i = a[0]
fmt.Println(i)
return i
}
func testSlice2() {
var array = [...]int{1001,1002,1003,1004,1005} //数组
var slice = array[1:3] //切片
fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
fmt.Println()
for i:=range slice{
slice[i]+=100
}
fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
fmt.Println()
slice = append(slice, 1006)
fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
fmt.Println()
slice = append(slice, 1007,1008,1009,1010) //切片扩容超过原容量后,会重新创建并指向一个新的底层数组
fmt.Println(array,"、长度:",len(array),"、容量:",cap(array))
fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
fmt.Println()
slice = append(slice, 1011,1012,1013)
fmt.Println(slice,"、长度:",len(slice),"、容量:",cap(slice))
fmt.Println()
fmt.Println(reflect.TypeOf(array))
fmt.Println(reflect.TypeOf(slice))
}
输出:
[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[0 0 0] 、长度: 3 、容量: 5
[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[100 100 100] 、长度: 3 、容量: 5
[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[100 100 100 1006] 、长度: 4 、容量: 5
[1001 1002 1003 1004 1005] 、长度: 5 、容量: 5
[100 100 100 1006 1007 1008 1009 1010] 、长度: 8 、容量: 10 //切片扩容超过原容量后,会重新创建一个底层数组,与原数组再无关联。容量翻倍
[100 100 100 1006 1007 1008 1009 1010 1011 1012 1013] 、长度: 11 、容量: 20 //追加超过容量,容量翻倍
[5]int //有长度,是数组
[]int //无长度,是切片