func main() {
//定义数组 数量在类型的前面
var arr [5] int // 不定义值为0
arr1 := [3]int{1} // := 必须赋值 最少赋值1位
arr2 := [...]int{4,5,6,7,8} //...可不规定长度
//二维数组
var arr3 [2][5]int
fmt.Println(arr, arr1, arr2, arr3)
//不建议这么使用 建议用go的range
for i:= 0; i < len(arr2); i++ {
fmt.Println(arr2[i])
}
//建议这么使用range
func itemKey (arr2 [5]int) {
for key, item := range arr2 {
fmt.Println(key, item)
}
}
//数组是值类型 会拷贝引用,不会传递引用 可以用指针的方式 但是不建议 建议使用切片slice
passByValue(&arr2)
}
//go的数组是值类型 所以都是值传递 可以通过指针去改成引用传递 不建议啊!!!
func passByValue(arr *[5]int) {
arr[0] = 100000
for key, value := range arr {
fmt.Println(key, value)
}
}
a1 := arr[1:] //从下标1开始 到结束
a2 := arr[:3] //从下标0到下标3 不包括下标3
a3 := arr[:] //从下标0到结束
fmt.Println(a1,a2,a3)
//切片
func again() {
//构造数组
arr := [...]int{2,3,4,5,6}
//获取数组切片
sliarr := arr[1:]
fmt.Println("切割新的数组 = ",sliarr)
//变更切片里的值
sliarr[0] = 200
fmt.Println("重新赋值新的数组 = ",sliarr)
//切片只是原来数组的一个view 合并原来的
fmt.Println("切片只是原来数组的一个view 合并原来的数组",arr)
}
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/liutong/go #gosetup
/usr/local/go/bin/go build -o /private/var/folders/gw/m800qsgs6mvf4zt_tk_y9jwh0000gn/T/___go_build_Slice_go /Users/liutong/go/src/ltstudy/demo_five/Slice.go #gosetup
/private/var/folders/gw/m800qsgs6mvf4zt_tk_y9jwh0000gn/T/___go_build_Slice_go #gosetup
切割新的数组 = [3 4 5 6]
重新赋值新的数组 = [200 4 5 6]
切片只是原来数组的一个view 合并原来的数组 [2 200 4 5 6]
//slice只能向后扩展,不能向前扩展
func priSlices() {
slic := [...]int{0,1,2,3,4,5,6,7}
//slice本身没有数据,是对底层array的一个view
s1 := slic[2:5]
s2 := s1[1:5]
fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1,len(s1),cap(s1))
fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d\n", s2,len(s2),cap(s2))
//向切片里添加数据 append
s3 := append(s2,10)
s4 := append(s3,11)
s5 := append(s4,12)
s6 := append(s5,13)
fmt.Println(s3, s4, s5, s6)
// s4 s5 no longer view arr
//添加元素时如果超越cap,系统会重新分配更大的底层数组
//由于值传递的原因,必须接受append的返回值
//s = append(s, val)
fmt.Println(slic) //超过原来下面的cap
}
sli= [2 3 4 5]
sli4= 5
[5 6]
s1=[2 3 4], len(s1)=3, cap(s1)=6
s2=[3 4 5 6], len(s2)=4, cap(s2)=5
[3 4 5 6 10] [3 4 5 6 10 11] [3 4 5 6 10 11 12] [3 4 5 6 10 11 12 13]
[0 1 2 3 4 5 6 10]
slice取出隐藏部分的实现原理:
slice可以扩展:ptr开关,len长度,cap整个长度
slice可以像后扩展,不可以向前扩展
s1[i]不可以超过len,向后扩展不可以超过底层数组的cap(s1)