go基础知识-数组和切片
1:数组:值类型
var a0 = [3]int{2,3,4}
fmt.Println(a0)
var a1 = [...]struct{
name string
age int
}{
{"jack",10},
{"tom", 20},
}
fmt.Println(a1)
//数组遍历
for k,v := range a1{
fmt.Println(k,v)
}
//指针数组 [n]*T
var a3 [3]*int
for i:=0;i<3;i++{
a3[i] = &i
}
for j:=0;j<3;j++ {
fmt.Printf("a[%d]=%d",j,*a3[j])
fmt.Println()
}
var a5 = [3]int{1,4,6}
//数组指针 *[n]T
var a4 *[3]int = &a5
fmt.Println(a4)
2.切片:引用类型
a.切片数组结构:
type SliceHeader struct {
Data uintptr //引用数组指针地址 Len int // 切片的目前使用长度 Cap int // 切片的容量}
b.空切片和nil切片区别:使用unsafe.Pointer查看
- nil切片和空切片指向的地址不一样。nil空切片引用数组指针地址为0(无指向任何实际地址)
- 空切片的引用数组指针地址是有的,且固定为一个值
- 下面案例里空切片和nil切片底层打印显示可以看出 nil切片指向的数组引用不存在,空切片指向的数组引用是存在并且所有空切片指向的数组引用是一样的,底层数组为空,底层Data指针非空
var a0 = []int{2,5,6}
fmt.Println(a0,len(a0))
//make 创建切片
var a1 = make([]int,10)
a1[0] = 3
a1[1] = 6
fmt.Println(a1)
//append
a1 = append(a1,4)
//nil切片
var a2 []int
fmt.Println(a2)
//查看切片底层
var a2Header = (*reflect.SliceHeader)(unsafe.Pointer(&a2))
fmt.Printf("Data:%v,Len:%v,Cap:%v",a2Header.Data,a2Header.Len,a2Header.Cap)//结果Data:0,Len:0,Cap:0
//空切片
var a3 = []int{}
fmt.Println(a3)
var a3Header = (*reflect.SliceHeader)(unsafe.Pointer(&a3))
fmt.Printf("Data:%v,Len:%v,Cap:%v",a3Header.Data,a3Header.Len,a3Header.Cap)//结果Data:4948760,Len:0,Cap:0
var a4 = make([]int,0,0)
fmt.Println(a4,&a4)
var a4Header = (*reflect.SliceHeader)(unsafe.Pointer(&a4))
fmt.Printf("Data:%v,Len:%v,Cap:%v",a4Header.Data,a4Header.Len,a4Header.Cap)//结果同a3
3.数组和切片区别和联系
a.区别:数组是值类型,切片是引用类型;数组大小固定,切片可以动态扩容
b.联系:切片底层是数组

浙公网安备 33010602011771号