数组的定义及初始化
func main() { var a [4]int //按数组长度自动初始化为0 var aa [4]int = [4]int{1, 2, 3, 4} var aaa = [4]int{1, 2, 3, 4} //定义并初始化 b := [4]int{2, 5} //按数组长度,没有初始化的自动初始化为0 c := [4]int{5, 3: 10} /*[...]int是数组 []int是切片*/ e := [...]int{10, 2: 100}//指定索引位置自动初始化0。2:初始化为1个0 d := [...]int{1, 2, 3}//按初始值数量自定义数组长度 fmt.Println(a) //[0 0 0 0] fmt.Println(aa) //[1 2 3 4] fmt.Println(aaa) //[1 2 3 4] fmt.Println(b) //[2 5 0 0] fmt.Println(c) //[5 0 0 10] fmt.Println(e) //[10 0 100] fmt.Println(d) //[1 2 3] }结构体数组
type user struct { name string age byte //char } func main() { d := [2]user{{"tom", 20}, {"marry", 18}} fmt.Println(d) fmt.Printf("%v\n", d)//相应值的默认格式。 fmt.Printf("%+v\n",d)//打印结构体时,会添加字段名 fmt.Printf("%#v", d)//相应值的Go语法表示 } 输出 [{tom 20} {marry 18}] [{tom 20} {marry 18}] [{name:tom age:20} {name:marry age:18}] [2]main.user{main.user{name:"tom", age:0x14}, main.user{name:"marry", age:0x12}}多维数组
用分层的方式来写多维数组,清晰明了,在这种情况下,n维可以看做一维数组下的n-1维数组
func main() { a := [2][2]int{{1, 2}, {3, 4}} //二维数组 /*[...]只能用在第一维数组中*/ b := [...][2]int{ //二维数组 {1, 2}, 3: {3, 4}, }//每一个元素用逗号隔开 c := [...][2][2]int{ //三维数组 { {1, 2}, {3, 4}, }, { {5, 6}, {7, 8}, }, }//按b,c的初始化方法,最后一个元素的后也要加逗号, fmt.Printf("%v\n%v\n%v", a, b, c) } [[1 2] [3 4]] [[1 2] [0 0] [0 0] [3 4]] [[[1 2] [3 4]] [[5 6] [7 8]]]注:内置函数len()和cap()用来返回第一维的长度,如:len(b)=4,cap(c)=2 2. 数组和指针
1.指针数组基础 在go中数组名不代表数组的首地址
1)%T表示相应值的类型的Go语法表示 2)%T表示相应值的类型的Go语法表示 3)%p十六进制表示,前缀 0x func main() { x, y := 10, 20 a := [...]*int{&x, &y} //定义指针数组,其中的各个元素为指针 p := &a //指向指针数组的指针 fmt.Printf("%T\n", a)//数组a的类型和长度 fmt.Printf("%v\n", a)//数组内的指针元素 fmt.Printf("%T\n", p)//p的类型,p是指向数组地址的指针 fmt.Printf("%p\n", p)//输出变量p的地址,实际上就是数组a的地址 fmt.Printf("%v\n", p)//输出p的值,即指针数组的地址 fmt.Printf("%v\n", *p)//输出p中的值,即指针数组 fmt.Printf("%p\n", &p)//输出指针p的地址 } [2]*int [0xc00000c1c8 0xc00000c1e0] *[2]*int 0xc0000481f0 &[0xc00000c1c8 0xc00000c1e0] [0xc00000c1c8 0xc00000c1e0] 0xc0000060282.数组指针可直接用来操作元素
func main() { a := [...]int{1, 2} p := &a p[1] += 10 fmt.Println(p[1]) } 输出:123.可以获取任意元素的地址
func main() { a := [...]int{1, 2} //定义一个整型数组 fmt.Println(&a, &a[0], &a[1]) //说明了数组名不是数组的首地址 } &[1 2] 0xc00000c1e0 0xc00000c1e8