深入学习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的地址值、函数的返回值数组的地址值都不一样。

总结

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值