数组是值传递,切片是指针传递
一、声明数组:
var n [5]type
//n是一个长度为5的数组
- 初始化数组:
n= [5]float32{1000.0,2.0,50.0,7.0,3.4}
或者
n :=[5]float32{1000.0,2.0,50.0,7.0,3.4}
初始化数组中{}中的元素个数不能大于[]中的数字
或者
n :=[…]float32{1000.0,2.0,50.0,7.0,3.4}
忽略数组的长度,编译器自动计算长度
二、声明切片:
-
通过声明一个未指定大小的数组来定义切片:
var n []type //切片不需要说明长度
或者
var n []int=make([]type,0)可以简写为 n :=make([]type ,0)
也可以指定容量
make([]type ,10,20) //指定一个容量为20,长度为10的切片 -
切片初始化:
s :=[] int {1,2,3} -
我们基于原数组或者切片创建一个新的切片后,那么新的切片的大小和容量是多少呢?这里有个公式,对于底层数组容量是 k 的切片 slice[i:j] 来说
长度: j-i
容量: k-i
package main
import "fmt"
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
func main() {
numbers := []int{0,1,2,3,4,5,6,7,8}
printSlice(numbers)
fmt.Println("numbers ==",numbers)
numbers1 := numbers[1:4]
printSlice(numbers1)
fmt.Println("numbers[:3] ==", numbers[:3])
numbers2 :=numbers[4:]
printSlice(numbers2)
numbers3 := make([]int,0,5)
printSlice(numbers3)
numbers4 := numbers[:2]
printSlice(numbers4)}
输出结果:
len=9 cap=9 slice=[0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
len=3 cap=8 slice=[1 2 3]
numbers[:3] == [0 1 2]
len=5 cap=5 slice=[4 5 6 7 8]
len=0 cap=5 slice=[]
len=2 cap=9 slice=[0 1]