通八洲科技

如何使用Golang实现指针遍历和修改数组元素_提高性能

日期:2025-12-17 00:00 / 作者:P粉602998670
Go中数组是值类型,传递或遍历会拷贝,影响性能;使用指向数组的指针(*[N]T)可避免复制,实现原地操作,比传值快100+倍,且比切片更安全可控。

在 Go 中,数组是值类型,直接传递或遍历会触发拷贝,影响性能;而使用指针(尤其是指向数组的指针)可避免复制,实现原地遍历与修改,显著提升大数组操作效率。

理解数组指针与切片的区别

Go 中 *[N]T 是指向固定长度数组的指针,它本身很小(仅存地址),解引用后可直接读写原数组;而切片 []T 是三元结构(底层数组指针、长度、容量),虽也高效,但若需严格限定长度、避免意外扩容或确保内存布局连续,数组指针更可控。

用指针遍历并修改大数组的典型写法

以下是一个将百万级整数数组全部加 1 的高效示例:

func incrementAll(ptr *[1e6]int) {
    for i := range ptr {
        (*ptr)[i]++ // 明确解引用写法,语义清晰
        // 或直接写 ptr[0][i]++(效果相同)
    }
}

// 调用
bigArr := [1e6]int{}
incrementAll(&bigArr) // 原数组被修改,无拷贝开销

注意:range ptr 在这里合法,因为 Go 规定对数组指针使用 range 时,会自动解引用并遍历其指向的数组。

避免常见误区

性能对比小提示

对 100 万元素的 [1e6]int