阐述一下Go 如何Array 类型的值作为函数参数 ?

在 Go 语言中,数组可以作为函数参数。但是,你需要注意的是,当数组作为函数参数时,函数会接收数组的一个副本,而不是对原数组的引用。这意味着,如果你在函数中修改数组,那么这些修改不会影响原数组。

以下是一个例子:

package main

import "fmt"

// function that takes an array as an argument
func modifyArray(a [5]int) {
    a[0] = 100
    fmt.Println("Inside function modifyArray: ", a)
}

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    modifyArray(a)
    fmt.Println("In main: ", a)
}

在这个例子中,modifyArray 函数接收一个长度为 5 的整数数组作为参数,并尝试修改第一个元素。然而,当我们在 main 函数中打印数组 a 的值时,我们可以看到,数组的值并没有改变。这是因为 modifyArray 函数修改的是数组的副本,而不是原数组。

如果你想在函数中修改原数组,你需要使用切片(slice)或者数组指针。切片在内部存储了对原数组的引用,因此在函数中修改切片会影响原数组。数组指针则直接指向原数组,通过指针也可以修改原数组。

以下是使用切片和数组指针作为参数的例子:

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

// Using array pointer
func modifyArrayPointer(a *[5]int) {
    (*a)[0] = 100
    fmt.Println("Inside function modifyArrayPointer: ", a)
}

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    modifySlice(a[:])
    fmt.Println("In main after modifySlice: ", a)

    a = [5]int{1, 2, 3, 4, 5} // reset array
    modifyArrayPointer(&a)
    fmt.Println("In main after modifyArrayPointer: ", a)
}

在这个例子中,modifySlicemodifyArrayPointer 函数都成功地修改了原数组。

发表评论

后才能评论