Go语言当中数组和切片在传递的时候的区别是什么?

发布于 1周前 作者 itying888 最后一次编辑是 5天前 来自 问答

Go语言当中数组和切片在传递的时候的区别是什么?

  1. 数组是值传递
  2. 切片是引用传递
1 回复

在Go语言中,数组(Array)和切片(Slice)是两种非常基础且常用的数据结构,它们在传递时有着显著的区别。

数组(Array)

  • 固定大小:数组在声明时其长度是固定的,不能改变。
  • 值传递:当数组作为参数传递给函数时,实际上是将数组的整个副本传递给函数。这意味着函数内部对数组的修改不会影响到原数组。

示例代码

package main

import "fmt"

func modifyArray(arr [3]int) {
    arr[0] = 100
    fmt.Println("Inside modifyArray:", arr)
}

func main() {
    arr := [3]int{1, 2, 3}
    modifyArray(arr)
    fmt.Println("Outside modifyArray:", arr) // 数组未改变
}

切片(Slice)

  • 动态数组:切片是对数组的抽象,提供了更灵活的操作方式,其长度可以动态变化。
  • 引用传递:当切片作为参数传递给函数时,传递的是切片的引用(或者说是指向切片底层数组的指针和切片的一些描述信息,如长度和容量)。因此,函数内部对切片的修改会影响到原切片。

示例代码

package main

import "fmt"

func modifySlice(slice []int) {
    slice[0] = 100
    fmt.Println("Inside modifySlice:", slice)
}

func main() {
    slice := []int{1, 2, 3}
    modifySlice(slice)
    fmt.Println("Outside modifySlice:", slice) // 切片已改变
}

总结

  • 数组在传递时是值传递,函数内部对数组的修改不会影响到原数组。
  • 切片在传递时是引用传递,函数内部对切片的修改会影响到原切片。

这个区别使得切片在Go语言中更为常用和灵活,特别是在处理大量数据或需要动态调整数据结构的场景中。

回到顶部