首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针和切片参考类型接收器

指针和切片参考类型接收器
EN

Stack Overflow用户
提问于 2015-04-24 03:32:11
回答 2查看 3.2K关注 0票数 6

我认为这将是有点明显的,一旦它被调用给我,但现在,以下不是点击。

代码语言:javascript
复制
type Stack []interface{}

func (stack *Stack) Push(x interface{}) {
    *stack = append(*stack, x)
}

我有一个名为Stack的类型,它是一个空接口的片段。如果它是空的,则Push方法满足接口。既然片是引用类型,为什么不能通过值传递‘堆栈’接收器呢?此外,在上面的示例中,接收器作为指针传递,为什么附加内置的需要再次通过指针传递?

考虑到切片是一个指向底层数组的引用指针,这为什么不能工作呢?

代码语言:javascript
复制
func (stack Stack) Push(x interface{}) {
    stack = append(stack, x)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-24 04:50:43

看这个关于Go博客的文章。它详细解释了正在发生的事情,并充分回答了你的问题。

部分将切片传递给函数

重要的是要理解,即使一个切片包含一个指针,它本身就是一个值。在封面下,它是一个包含指针和长度的结构值。它不是指向结构的指针。

因此,您要么需要一个指针接收器,要么需要将该片作为一个值返回,如果您想用append修改它。

如果您只想修改一个切片的内容,您只需通过值传递该切片:

即使切片头是通过值传递的,标头也包括指向数组元素的指针,因此原始切片头和传递给函数的头的副本都描述了相同的数组。因此,当函数返回时,可以通过原始的片变量看到修改的元素。

使用append,您将修改片头。和

因此,如果我们想编写修改标头的函数,则必须将其作为结果参数返回。

或者:

另一种让函数修改切片头的方法是传递一个指向它的指针。

您似乎也对指针的使用感到困惑。见等级库

对于类型为T的操作数,地址操作&x生成一个类型为*T到x的指针。

和:

对于指针类型*T的操作数,指针间接*x表示由x指向的T类型的变量。

因此,您的示例*stack = append(*stack, x)并不意味着要传递指向append的指针,恰恰相反--您正在取消引用指针以传递它所指向的值。

票数 8
EN

Stack Overflow用户

发布于 2015-04-24 04:51:12

您遇到的问题是,append返回对新切片的引用。除非函数是指针,否则不能更改函数接收器的值。

我建议的是制作一个包装器结构:

代码语言:javascript
复制
type Stack struct{
   data []interface{}
   size int
}
func (s *Stack) Push(i interface{}){
   s.data = append(s.data,i)
   s.size++
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29838240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档