一旦它被叫到我,我认为这将是一个明显的,但现在以下不是点击 .
type Stack []interface{}
func (stack *Stack) Push(x interface{}) {
*stack = append(*stack, x)
}
我有一个名为Stack的类型,它是一个空接口片 . 鉴于它是空的,Push方法满足接口 . 假设切片是一个引用类型,为什么“堆栈”接收器不能通过值传入?此外,在上面的例子中,接收器作为指针传递为什么追加内置需要再次通过指针传递?
IE为什么不能这样做,因为slice是一个指向底层数组的引用指针?
func (stack Stack) Push(x interface{}) {
stack = append(stack, x)
}
2 回答
见article on the Go blog . 它详细解释了正在发生的事情并完全回答了您的问题 .
从 Passing slices to functions 部分:
因此,您需要一个指针接收器,或者如果要使用
append
修改它,则需要将切片作为值返回 .如果您只想修改切片的内容,只需按值传递切片即可:
使用
append
,您正在修改切片标头 . 和要么:
你似乎也对指针的使用感到困惑 . 见spec:
和:
因此,您的示例
*stack = append(*stack, x)
并不意味着您将指针传递给append
,恰恰相反 - 您正在取消引用指针以传递它指向的值 .您遇到的问题是
append
返回对新切片的引用 . 除非是指针,否则无法更改函数接收器的值 .我建议的是制作一个包装器结构: