GO语言基础教程(75)Go函数的参数之传递数组:当数组走进函数大门:一场值拷贝的“硬核搬家”实录

那天,数组小姐鼓起勇气对函数先生说:“我想进入你的世界。”

函数先生温柔地回答:“欢迎,但有个规矩——你得完整复制一个自己才能进来。”

数组小姐看着自己庞大的身躯,欲哭无泪:“这...这也太不环保了吧!”

第一章:初遇数组参数 — 一场内存的“奢侈消费”

作为一个刚从Python或JavaScript转来的Gopher,你可能会习惯性地写出这样的代码:

func main() {
    scores := [5]int{90, 85, 78, 92, 88}
    printScores(scores)  // 看似普通的函数调用
    fmt.Println("原数组:", scores) // {90, 85, 78, 92, 88}
}

func printScores(arr [5]int) {
    fmt.Println("函数内数组:", arr)
    // 这里修改arr不会影响外面的scores
}

表面风平浪静,背后却发生了一场“内存大迁徙”。

重点来了:在Go里,当你把数组作为参数传递给函数时,发生的是值拷贝(value copy),不是引用传递!

什么意思?让我用个更直观的例子:

func main() {
    // 假设这是个装满珍贵数据的数组
    bigData := [1000000]int{}
    for i := range bigData {
        bigData[i] = i
    }
    
    processArray(bigData) // 危险操作!
}

func processArray(data [1000000]int) {
    // 就为了这个简单的打印...
    fmt.Println("数组长度:", len(data))
}

你发现痛点了吗?为了一个简单的函数调用,Go在背后默默复制了1000000个整数!这好比你要看朋友的照片,他非要把自家整个相册连柜子都搬过来给你。

第二章:解剖值拷贝 — 数组的“分身术”

为了真正理解发生了什么,我们来看看内存布局:

原始数组scores (main函数中)
内存地址: 0x1000 → [90, 85, 78, 92, 88]

当调用printScores(scores)时:
Go会创建副本,假设新地址: 0x2000 → [90, 85, 78, 92, 88]

用代码验证一下:

package main

import "fmt"

func main() {
    arr := [3]int{1, 2, 3}
    fmt.Printf("原数组地址: %p\n", &arr) // 比如: 0xc000018240
    
    checkAddress(arr)
}

func checkAddress(copyArr [3]int) {
    fmt.Printf("副本数组地址: %p\n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值