将数组作为函数参数传递

P.A*_*.An 3 go

我期望以下代码片段生成aas {0x01, 0x02}(按值传递)或as {0x03, 0x02, 0x01}(按引用传递).奇怪的是,它产生的输出为{0x03, 0x02}.你能帮我理解为什么吗?

package main

import "fmt"

func test1(t []byte) {
    t[0] = 0x03
    t = append(t, 0x01 )
}

func main() {
    a := []byte{0x01, 0x02 }
    test1(a)
    _ = a
    fmt.Printf("%v", a)
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*mkó 6

在Go []byte中不是数组,它是一个字节切片.

发生的事情是大小a为2,因此,在第一个元素更改为3后,append分配了一个新的更大的切片 - 并t设置为分配的新切片的地址,但这不会影响在amain.

去参观append:

如果s的后备数组太小而无法满足所有给定值,则将分配更大的数组.返回的切片将指向新分配的数组.