Go中的数组

175 阅读2分钟

Go中的数组

概念

数组是用来存储集合的数据。除了数组还有切片, map映射等, 但数组是他们的基础。

内部实现

  1. 数组是长度固定的数据类型
  2. 数组必须存储类型相同并且连续的元素
  3. 可以通过索引获得数组中的任意数据
  4. 因为数据元素类型相同, 也可以通过反射, 获取类型占用大小, 进行移位, 获取相应元素

声明和初始化

声明特点

  1. 指定存储数据的类型
  2. 指定存储数据的数量
  3. 数组一旦声明之后, 元素类型和大小都不能发生改变; 如果要改变数组结构只能创建新数组, 将原数组复制进去

初始化

  • 用零值初始化数组, 用值再次初始化

    var array [5]int
    array = [5]int{1, 2, 3, 4, 5}
    
  • 使用:=符号进行初始化

    array := [5]int{1, 2, 3, 4, 5}
    
  • 使用...符号初始化数组

    array := [...]int{1, 2, 3, 4, 5}
    
  • 数组部分初始化

    array := [...]int{0 ,1, 0, 4, 0}
    array := [...]int{1: 1, 3: 4}
    

使用数组

访问数组

使用索引进行数组数据访问

array:=[5]int{1:1,3:4}
fmt.Printf("%d",array[1])

修改数组

使用索引修改数组

array:=[5]int{1:1,3:4}
fmt.Printf("%d\n",array[1])
array[1] = 3
fmt.Printf("%d\n",array[1])

获得数组中的所有值

  • for循环

    
    array := [5]int{1: 1, 3: 4}
    for i := 0; i < 5; i++ {
    	fmt.Printf("索引:%d,值:%d\n", i, array[i])
    }
    
  • for range 循环

    func main() {
    array := [5]int{1: 1, 3: 4}
    for i, v := range array {
    	fmt.Printf("索引:%d,值:%d\n", i, v)
    }
    
    

相同类型数组赋值

  • 相同数组

    1. 数组长度一致
    2. 数组中每个元素类型必须一致
  • 赋值过程

    array := [5]int{1, 2, 3, 4, 5}
    var array1 [5]int = array // success
    var array2 [4]int = array // error
    

指针数组

  • 元素类型为指针的数组
  • 只能给分配内存的索引赋值, 未分配的索引是无效的
  • 创建过程
    array := [5]*int{1: new(int), 3:new(int)}
    *array[1] = 1
    

注意点

  1. 数组指针和指针数组是两个概念
  2. 数组指针 *[5]int
  3. 指针数组 [5]*int