将数组作为函数参数传递

时间:2018-05-15 12:38:52

标签: go

我希望以下代码段能够生成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)
}

2 个答案:

答案 0 :(得分:6)

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

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

A Tour of Go关于append

  

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

答案 1 :(得分:1)

切片标头按值传递,但它引用相同的支持数组。因此,当您更改第一个值时,它也会在原始数组中更改。当您调用append时,会生成一个新的切片标头并将其写入原始参数值占用的空间,从而保持方法的本地。