我认为这将是有点明显的,一旦它被调用给我,但现在,以下不是点击。
type Stack []interface{}
func (stack *Stack) Push(x interface{}) {
*stack = append(*stack, x)
}我有一个名为Stack的类型,它是一个空接口的片段。如果它是空的,则Push方法满足接口。既然片是引用类型,为什么不能通过值传递‘堆栈’接收器呢?此外,在上面的示例中,接收器作为指针传递,为什么附加内置的需要再次通过指针传递?
考虑到切片是一个指向底层数组的引用指针,这为什么不能工作呢?
func (stack Stack) Push(x interface{}) {
stack = append(stack, x)
}发布于 2015-04-24 04:50:43
看这个关于Go博客的文章。它详细解释了正在发生的事情,并充分回答了你的问题。
从部分将切片传递给函数
重要的是要理解,即使一个切片包含一个指针,它本身就是一个值。在封面下,它是一个包含指针和长度的结构值。它不是指向结构的指针。
因此,您要么需要一个指针接收器,要么需要将该片作为一个值返回,如果您想用append修改它。
如果您只想修改一个切片的内容,您只需通过值传递该切片:
即使切片头是通过值传递的,标头也包括指向数组元素的指针,因此原始切片头和传递给函数的头的副本都描述了相同的数组。因此,当函数返回时,可以通过原始的片变量看到修改的元素。
使用append,您将修改片头。和
因此,如果我们想编写修改标头的函数,则必须将其作为结果参数返回。
或者:
另一种让函数修改切片头的方法是传递一个指向它的指针。
您似乎也对指针的使用感到困惑。见等级库
对于类型为T的操作数,地址操作&x生成一个类型为*T到x的指针。
和:
对于指针类型*T的操作数,指针间接*x表示由x指向的T类型的变量。
因此,您的示例*stack = append(*stack, x)并不意味着要传递指向append的指针,恰恰相反--您正在取消引用指针以传递它所指向的值。
发布于 2015-04-24 04:51:12
您遇到的问题是,append返回对新切片的引用。除非函数是指针,否则不能更改函数接收器的值。
我建议的是制作一个包装器结构:
type Stack struct{
data []interface{}
size int
}
func (s *Stack) Push(i interface{}){
s.data = append(s.data,i)
s.size++
}https://stackoverflow.com/questions/29838240
复制相似问题