小编Sam*_*myO的帖子

请解释 golang 类型是否按值传递

我正在尝试制作一个非常简单的程序来修改数组,但是如果我将它们转换为类型,则会遇到一些有趣的行为。https://play.golang.org/p/KC7mqmHuLw看来,如果我有一个数组,则按引用传递,但如果我有一个类型,则按值传递。它是否正确?

我有两个变量 b 和 c,都是 3 个整数的数组,但 c 是 cT 类型,在其他方面它们应该是相同的。我可以将值指定为b[0]=-1c[0]=-1,但是如果我将这些数组作为参数传递给函数,它们的行为就会非常不同。

程序的输出是:

b 之前:[1 2 3]

c之前:[1 2 3]

*b 之后:[-1 2 0]

*c 之后:[-1 2 3]

*什么?c:[-1 2 0]

我最初的假设是“after b”和“after c”行应该是相同的。我是否做错了什么,或者我对按值传递给函数的类型是否正确(即在传递给函数之前创建变量的副本)?

package main

import "fmt"

type cT [3]int

func main() {
    b := []int{1, 2, 3}
    c := cT{1, 2, 3}

    fmt.Println("before b:", b)
    fmt.Println("before c:", c)

    b[0] = -1
    c[0] = -1
    mangleB(b) // ignore return value
    mangleC(c) // ignore return …
Run Code Online (Sandbox Code Playgroud)

parameter-passing pass-by-reference pass-by-value go pass-by-pointer

5
推荐指数
1
解决办法
6414
查看次数