Go 数组
数组:值类型、必须规定类型长度且一旦定义不可更改、len函数获得数组的长度
数组是什么?用来存储集合数据的。
存储数据有哪些方式?切片slice、映射Map等。
数组内部实现是怎么样的?数组是长度固定的数据类型,必须存储一段相同类型的元素,且这些元素是连续的(故索引很好计算,可很快的索引数组中的任何数据)。
数组数据存储的类型是什么?可以是内置类型(比如整型、字符串),可以是自定义的数据结构。
数组与切片最明显区别是?数组固定长度。
数组如何进行声明? var name [SIZE]type 比如: var array [5]int 。一旦声明后,元素类型和大小均不能改变,若需存储更多的元素,只能创建一个新的数组并将原来数组的数据复制过去。多维数组: var threedim [5][10][4]int
数组未初始化值为多少?数组array里值为对应元素类型的零值。(比如int零值是:0,而Java中应当是null)
如何创建数组时候直接初始化?使用 := 操作符,比如
array2 := [3]int{1,2,3} array3 := [...]int{1,2,3} //使用...,Go会自动推导出数组的长度。
如何只初始化部分值?两种方法:直接或者利用索引。
array4 := [5]int{1,0,3,0,0} array4 := [5]int{0:1,2:3}
使用数组?通过索引来访问,操作符是 [] ,比如:
array2 := [3]int{1,2,3} fmt.Println("%d",array2[1]) //输出是:2
如何循环打印数组值?两种方法:传统的for循环或者for range循环
a := [...]float64{67.7, 89.8, 21, 78} for i := 0; i < len(a); i++ { //looping from 0 to the length of the array fmt.Printf("%d th element of a is %.2f\n", i, a[i]) } array := [5]int[1:1,3:4] for i,v := range array { fmt.Println("索引:%d,值:%d",i,v) } //i,v可以通过下划线_来省略
数组赋值有什么规定?同样类型的数组可以相互赋值,不同类型的不行。
Go中什么是同样类型的数组?长度一样、并且每个元素的类型也一样的数组。
什么是指针数组?与数组类似,元素类型是指针。比如:
array := [5]*int{1:new(int),3:new(int)} *array[1] = 1 //这里只能给索引1和索引3赋值,因为只有它们分配了内存。 //如果此时给索引0赋值会出错,提示无效内存或一个nil,必须给它重新分配内存才可,比如 array[0] = new(int) *array[0] = 2
函数间如何传递数组?函数间传递变量,通常以值的方式,若变量为数组,则将整个数组赋值传递给函数(故数组大,对内存开销大)
例子:
func modify1(a [5]int){ a[1]=3 fmt.Println(a) } func modify2(a *[5]int){ a[1]=3 fmt.Println(*a) } func main() { array := [5]int{1:2,3:4} modify1(array) fmt.Println(array) //结果不变,仍然为2 modify2(&array) fmt.Println(array) //输出为:3 }
数组的指针和指针数组?数组的指针为 *[5]int 指针数组是 [5]*int