插件窝 干货文章 Go语言数组赋值:为什么修改副本不影响原数组?

Go语言数组赋值:为什么修改副本不影响原数组?

数组 切片 副本 修改 140    来源:    2025-03-16

在Go语言中,数组是值类型(value type),而不是引用类型(reference type)。这意味着当你将一个数组赋值给另一个变量时,实际上是将整个数组的内容复制一份,而不是简单地复制一个指向数组的引用。

示例代码

package main

import "fmt"

func main() {
    // 定义一个数组
    originalArray := [3]int{1, 2, 3}

    // 将数组赋值给另一个变量
    copyArray := originalArray

    // 修改副本数组
    copyArray[0] = 100

    // 打印原数组和副本数组
    fmt.Println("Original Array:", originalArray) // 输出: [1 2 3]
    fmt.Println("Copy Array:", copyArray)         // 输出: [100 2 3]
}

解释

  1. 值类型:在Go语言中,数组是值类型。当你将一个数组赋值给另一个变量时,Go会创建一个新的数组,并将原数组的所有元素逐个复制到新数组中。因此,copyArrayoriginalArray 的一个完全独立的副本。

  2. 修改副本:当你修改 copyArray 时,你只是在修改这个副本,而不会影响 originalArray。因为它们是两个完全独立的内存区域。

  3. 引用类型:如果你希望修改副本时也影响原数组,可以使用切片(slice)或指针(pointer)。切片和指针是引用类型,它们指向相同的内存区域。

使用切片(slice)的示例

package main

import "fmt"

func main() {
    // 定义一个切片
    originalSlice := []int{1, 2, 3}

    // 将切片赋值给另一个变量
    copySlice := originalSlice

    // 修改副本切片
    copySlice[0] = 100

    // 打印原切片和副本切片
    fmt.Println("Original Slice:", originalSlice) // 输出: [100 2 3]
    fmt.Println("Copy Slice:", copySlice)         // 输出: [100 2 3]
}

在这个例子中,originalSlicecopySlice 都指向同一个底层数组,因此修改 copySlice 会影响到 originalSlice

总结

  • 数组是值类型,赋值时会复制整个数组,修改副本不会影响原数组。
  • 切片指针是引用类型,赋值时不会复制数据,修改副本会影响原数据。

如果你希望修改副本时也影响原数组,可以考虑使用切片或指针。