返回顶部
扩大
缩小

人外有人天外有天

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 

 

posted on 2018-07-28 21:01  笔记是研究的开始  阅读(144)  评论(0编辑  收藏  举报

导航