我希望以下代码段能够生成a
{0x01, 0x02}
(按值传递)或{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)
}
答案 0 :(得分:6)
在Go []byte
中不是数组,它是一个字节切片。
发生的事情是a
的大小是2,因此,在第一个元素更改为3之后,append
分配了一个新的更大的切片 - t
是设置为已分配的新切片的地址,但这不会影响a
中的main
。
A Tour of Go关于append
:
如果s的后备数组太小而无法满足所有给定值,则会分配更大的数组。返回的切片将指向新分配的数组。
答案 1 :(得分:1)
切片标头按值传递,但它引用相同的支持数组。因此,当您更改第一个值时,它也会在原始数组中更改。当您调用append
时,会生成一个新的切片标头并将其写入原始参数值占用的空间,从而保持方法的本地。