Golang学习笔记(五):数组

https://juejin.im/post/5c8267896fb9a049bc4d7361

Go语言中的数组,与结构体一样,是一种复合数据类型,也是一种固定长度存放特定类型的序列,这一节,让我们一起来来学习一下吧。

声明与使用

Go数组有两个特征,一:固定长度,数组声明后长度便不能再修改,所以不灵活,在Go语言中,更多的是使用与数组相似的Slice类型,但Slice的底层是数组,因此有必要了解一下数组,二:数组只能存储一种特定类型,与结构体这种可能放多种数据类型不同。

在声明数组的时候,如果没有初始化,则以定义的类型零值作为每个数组的元素的初始化,如整型为0,字符串为””。

下面是定义数组的几种方式

  1. package main
  2. package main(){
  3. var i [5]int //定了长度为5的整型数组,每个元素的初始值为0
  4. var j [5]int = [5]int{1,3,5} //在声明的时候初始化,第三、四个元素值为0
  5. var k = [5]int{1,2,4} //通过表达式定义数组时,必须初始化,如果省略{1,3,4},不能通过编译
  6. p := [4]{1,2,4,5} //简短变量,必须初始化
  7. t := [...]{1,2,3,4}//当长度为...,则通过花括号中的元素个数来确定长度
  8. s := [5]{4:1}//也可通过指定下标值初始化,这样下标为4的元素值是1,其他元素值为零值
  9. }

定义数组后,长度与类型不能变化,长度可能内置函数len()获取,可以通过下标值访问数组某个元素或为其赋值,下标从0开始,下标取值范围是0~len()-1。

  1. package main
  2. import "fmt"
  3. func main(){
  4. a := [10]string{"a","b"}
  5. fmt.Println(len(a))//输出:5
  6. a[2] = "c" //通过下标赋值
  7. fmt.Println(a[3])//通过下标访问元素
  8. }

相等比较与遍历

相同长度与类型的数组才可能进行相等比较,不然会报错,而只有数组中每个元素都相等,两个数组才相等。

除了通过元素下标访问数组外,更多的时候,我们可以通过for…range语句遍历整个数组。

  1. package main
  2. func main(){
  3. a1 := [5]int{1,2,3}
  4. a2 := [4]int{1,2,3}
  5. a3 := [5]int{1,3,4}
  6. a4 := [5]int{1,2,3}
  7. fmt.Println(a1 == a2)//报错
  8. fmt.Println(a1 == a3) // false,数组元素不相等
  9. fmt.Println(a1 == a4) // true
  10. for i,v := range a1 {//i为数组下标,v为数组元素的值
  11. fmt.Println(i,v)
  12. }
  13. for _,v := range a1 {//忽略下标值
  14. fmt.Println(v)
  15. }
  16. }

作为参数传给函数

当我们把数组作为参数值传某个函数时,函数会复制一个数组副本,因此不会影响原来的数组且效率低,当我们想通过函数改变原来数组的元素时候,可以传通过一个数组指针来达到目的。

另外,作为参数传给数组时,长度与类型与函数形参必须一致,不然也会报错的。

  1. package main
  2. import "fmt"
  3. func main(){
  4. var i [5]int
  5. var j [6]int
  6. changeArrayOne(i)
  7. fmt.Println(i)//[0,0,0,0,0],元素值并没有发生改变
  8. changeArrayTwo(&i)
  9. fmt.Println(i)//[0,100,0,0,0],第一个元素值为100
  10. changeArrayOne(j)//报错
  11. }
  12. func changeArrayOne(i [5]int){
  13. i[1] = 100
  14. }
  15. func changeArrayTwo(i *[5]int){
  16. i[1] = 100
  17. }

由上面例子可以看到,将[6]int类型的数组,并不能赋值形参为[5]int的数组,且数组长度固定,不能像Slice一样,可以动态添加与删除元素,因此非常不灵活,另外一个就是传给函数时会复制一个数组副本,比较耗内存,虽然可以通过数组指针解决,但在实际开发中,比较常用的是引用类型Slice。

ft_authoradmin  ft_create_time2019-08-03 17:05
 ft_update_time2019-08-03 17:05