请参阅Go博客上的这篇文章。它详细解释了正在发生的事情,并完全回答了您的问题。
从“将切片 传递给函数 ”部分:
重要的是要理解,即使切片包含指针,它本身也是一个值。在幕后,它是一个结构值,包含一个指针和一个长度。它不是指向结构的指针。
结果,您需要一个指针接收器,或者如果要使用进行修改,则需要将切片作为值返回
append。
如果您只想修改切片的内容,则只需按值传递切片:
即使分片标头按值传递,标头也包含指向数组元素的指针,因此原始分片标头和传递给函数的标头副本都描述了同一数组。因此,当函数返回时,可以通过原始slice变量看到修改后的元素。
随着
append要修改的片段头部。和
因此,如果要编写修改标头的函数,则必须将其作为结果参数返回
要么:
让函数修改切片头的另一种方法是将指针传递给它。
您似乎也对指针的使用感到困惑。见规格:
对于类型T的操作数x,地址操作&x生成指向 T的类型 T的指针。
和:
对于指针类型 T的操作数x,指针间接 x表示x指向的类型T的变量。
因此,您的示例
*stack = append(*stack, x)并不意味着您要传递指向的指针
append,恰恰相反-
您要取消引用该指针以传递其指向的值。



