深入学习Go-3 数组

数组是由相同类型的元素组成的集合,在内存中分配了一片连续的区域,初始化时需要指定长度。

数组类型

Go 语言数组在初始化之后大小就无法改变,存储元素类型相同、但是大小不同的数组类型是完全不同的,只有两个条件都相同才是同一类型。通过下面的例子验证一下:

func main() {
    a1 := [3]int{1, 2, 3}
    a2 := [...]int{1, 2, 3}
    a3 := [...]int{1, 2, 3, 4}

    fmt.Println("数组a1的类型是: ", reflect.TypeOf(a1))
    fmt.Println("数组a2的类型是: ", reflect.TypeOf(a2))
    fmt.Println("数组a3的类型是: ", reflect.TypeOf(a3))
}

输出结果:

图片

从例子中我们可以看出,数组a1,a2,a3都是int型数组,但是长度不一样,所以他们是不同的类型。 

数组值复制

Go语言中的数组在赋值、函数传参及函数返回值时都是值复制,我们通过例子来验证:

func chArray(a [5]int) [5]int {
    a[0] = 6
    fmt.Printf("参数数组 a 的地址: %p\n", &a)
    return a
}

func main() {
    array1 := [...]int{1, 2, 3, 4, 5}
    array2 := array1
    
    fmt.Printf("数组array1的地址: %p\n", &array1)
    fmt.Printf("数组array2的地址: %p\n", &array2)
    
    array3 := chArray(array2)
    fmt.Printf("返回值数组array3的地址: %p\n", &array3)
    
    fmt.Printf("数组array1的值: %v\n", array1)
    fmt.Printf("数组array2的值: %v\n", array2)
    fmt.Printf("数组array3的值: %v\n", array3)
}

 输出结果:

图片

在例子中,数组array1复制给了array2,两个数组的地址值不同,是完全不同的两个数组。将array2做为参数传递给函数chArray,形参a的地址值、函数的返回值数组的地址值都不一样。

总结

数组的长度也是数组类型的一部分。数组在赋值、函数传参及函数返回值时都是值复制。


更多【分布式专辑】【架构实战专辑】系列文章,请关注公众号

猜你喜欢

转载自blog.csdn.net/lonewolf79218/article/details/121602017