跳转至

数组

数据在 go 语言中也相当的特别, 1 就算同是 int 类型的数组,如果他们在声明的长度不一样,那么也认为他们是不同的类型;2: 数组在 go 语言中为认为是值类型。


声明

go 语言的数组场景方式比较特别

package main

import "fmt"

func main() {
    // 1.声明并初始化长度为 3 的整型数组
    var arr_x = [3]int{100, 200, 300}
    fmt.Printf("len = %d, cap = %d, arr_x = %s \n", len(arr_x), cap(arr_x), arr_x)

    // 省略长度
    var arr_y = [...]int{100, 200, 300}
    fmt.Printf("len = %d, cap = %d, arr_y = %s \n", len(arr_y), cap(arr_y), arr_y)

    // 缺省值会被自动初始化为 0
    var arr_z = [3]int{}
    fmt.Printf("len = %d, cap = %d, arr_z = %s \n", len(arr_z), cap(arr_z), arr_z)

    // 使用索引初始化
    var arr_a = [3]int{0: 111, 1: 222, 2: 333}
    fmt.Printf("len = %d, cap = %d, arr_a = %s \n", len(arr_a), cap(arr_a), arr_a)
}
运行效果
go run .
len = 3, cap = 3, arr_x = [%!s(int=100) %!s(int=200) %!s(int=300)] 
len = 3, cap = 3, arr_y = [%!s(int=100) %!s(int=200) %!s(int=300)] 
len = 3, cap = 3, arr_z = [%!s(int=0) %!s(int=0) %!s(int=0)] 
len = 3, cap = 3, arr_a = [%!s(int=111) %!s(int=222) %!s(int=333)]


数组是值类型

数组是值类型,就意味着在数据做为参数传给函数时,这个时候会全量的复制数据。

package main

import "fmt"

func PrintAddr(arr [4]uint8) {
    fmt.Printf("addresss of  arr: %p type = %T \n", &arr, arr)
}

func main() {
    var ages = [4]uint8{1, 3, 5, 7}
    fmt.Printf("addresss of ages: %p type = %T \n", &ages, ages)
    PrintAddr(ages)
}
运行效果
go run .
addresss of ages: 0x1400000e0a4 type = [4]uint8 
addresss of  arr: 0x1400000e0ac type = [4]uint8 


迭代

package main

import "fmt"

func main() {
    var arr_x = [3]int{100, 200, 300}
    fmt.Printf("len = %d, cap = %d, arr_x = %s \n", len(arr_x), cap(arr_x), arr_x)

    for index, value := range arr_x {
        fmt.Printf("index = %d, value = %d \n", index, value)
    }
}

切片

package main

import "fmt"

func main() {
    var arr_x = [3]int{100, 200, 300}
    fmt.Printf("type of arr_x = %T \n", arr_x)
    fmt.Printf("len = %d, cap = %d, arr_x = %s \n", len(arr_x), cap(arr_x), arr_x)

    // 切片
    var arr_y = arr_x[0:2]
    fmt.Printf("type of arr_y = %T \n", arr_y)
    for index, value := range arr_y {
        fmt.Printf("index = %d, value = %d \n", index, value)
    }
}

最后

可以看到在 go 语言中对数据的限制还是比较多的,这个也就是我们平时不用它的原因,大多数情况下我们用切片这个动态数据类型来解决。