Sam*_*myO 5 parameter-passing pass-by-reference pass-by-value go pass-by-pointer
我正在尝试制作一个非常简单的程序来修改数组,但是如果我将它们转换为类型,则会遇到一些有趣的行为。https://play.golang.org/p/KC7mqmHuLw看来,如果我有一个数组,则按引用传递,但如果我有一个类型,则按值传递。它是否正确?
我有两个变量 b 和 c,都是 3 个整数的数组,但 c 是 cT 类型,在其他方面它们应该是相同的。我可以将值指定为b[0]=-1
和c[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 value
fmt.Println("*after b:", b)
fmt.Println("*after c:", c)
c = mangleC(c)
fmt.Println("*what? c:", c)
}
func mangleB(row []int) []int {
row[2] = 0
return row
}
func mangleC(row cT) cT{
row[2] = 0
return row
}
Run Code Online (Sandbox Code Playgroud)
数组是单一类型元素的编号序列,称为元素类型。
切片是底层数组的连续段的描述符,并提供对该数组中元素的编号序列的访问。
在函数调用中,函数值和参数按通常的顺序求值。在评估它们之后,调用的参数将按值传递给函数,并且被调用的函数开始执行。当函数返回时,函数的返回参数按值传递回调用函数。
Run Code Online (Sandbox Code Playgroud)type cT [3]int b := []int{1, 2, 3} c := cT{1, 2, 3}
我有两个变量,
b
和c
,都是 3 个整数的数组
不,你不!
b
是长度 ( ) 3 和容量 ( ) 3的切片,是( ) 3的数组。int
len(b)
cap(b)
c
len(c)
int
在Go中,所有参数都是按值传递的。b
作为切片描述符传递,c
作为数组传递。切片描述符是struct
具有切片长度和容量以及指向底层数组的指针。