当前位置: 首页 > 面试题库 >

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

周志文
2023-03-14
问题内容

我认为,一旦它被召唤出来,这将变得有点明显,但现在以下内容并未点击。

type Stack []interface{}

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

我有一个叫做Stack的类型,它是空接口的一部分。假定为空,则Push方法满足该接口。给定切片是引用类型,为什么不能仅按​​值传递“堆栈”接收器?此外,在上面的示例中,接收器作为指针传递,为什么附加的内置内置元素需要再次通过指针传递?

IE,鉴于分片是指向基础数组的引用指针,为什么不起作用?

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

问题答案:

请参阅Go博客上的这篇文章。它详细解释了正在发生的事情,并完全回答了您的问题。

从“将切片 传递给函数 ”部分:

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

结果,您需要一个指针接收器,或者如果要使用进行修改,则需要将切片作为值返回append

如果您只想修改切片的内容,则只需按值传递切片:

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

随着append要修改的片段头部。和

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

要么:

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

您似乎也对指针的使用感到困惑。见规格:

对于类型T的操作数x,地址操作&x生成指向 T的类型 T的指针。

和:

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

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



 类似资料:
  • 问题内容: 我有以下代码: 但是我想将一个指向字节切片的指针传递给另一个函数,并在那里切片,所以类似: 它给我一个错误,我不能在函数参数中使用type 作为类型,并且不能对type进行切片。怎么了?默认情况下切片不是通过引用传递的吗?我试图在没有指针的情况下执行此操作,但是它不起作用- 正在复制数组。我怎样才能做到这一点? 问题答案: 该错误来自您尚未发布的拼写错误(您尝试传递一个切片而不是指向的

  • 值得注意点的是切片的本质就是一个指针指向数组,所以指向切片的指针是一个二级指针 package main import "fmt" func main() { // 1.定义一个切片 var sce[]int = []int{1, 3, 5} // 2.打印切片的地址 // 切片变量中保存的地址, 也就是指向的那个数组的地址 sce = 0xc0420620a0 f

  • 问题内容: 在用于golang的mongodb驱动程序中,包含以下代码: 接口清零器的定义如下: 当我实现我的结构 有用。但是,当我使用指针接收器实现IsZero方法时: 类型声明失败,并且IsZero无法执行。 谁可以给我解释一下这个? 问题答案: 据推测某处之上的有上的开关 如果您在Reflection包中查看,则此处的文档 是其中一种,又是另一种。在switch语句中,它不匹配,因为该方法的

  • 问题内容: 我想将jackson json库用于通用方法,如下所示: … 现在的问题是,当我调用位于请求对象内的getMyObject()时,杰克逊将嵌套的自定义对象作为LinkedHashMap返回。有什么方法可以指定需要返回T对象吗?例如:如果我发送了类型为Customer的对象,则应该从该List?中返回Customer。 问题答案: 这是Java类型擦除的一个众所周知的问题:T只是一个类型

  • 问题内容: 对于我来说,目前尚不清楚,在这种情况下,我想使用值接收器而不是始终使用指针接收器。 回顾一下文档: 该 文档 还说:“对于基本类型,切片和小型结构之类的类型,值接收器非常便宜,因此,除非该方法的语义要求使用指针,否则值接收器是高效且清晰的。” 首先, 它说“非常便宜”,但问题是它比指针接收器便宜。因此,我做了一个小的基准测试(基于要点的代码),向我展示了,即使对于只有一个字符串字段的结

  • 问题内容: 我目前正在努力完成出色的“围棋之旅”。我使用以下解决方案完成了其中一项练习(#45): 我不明白为什么我必须使用两次该类型的语句(请参见摘要中的注释)。这似乎是多余的,但我不知道该怎么做。 问题答案: Go中没有其他方法可以做到这一点。 是的,我同意这很冗长,但有必要。第二个make()语句完全独立于第一个。可以争论的是,编译器应该能够从推断类型,但此时还不行。 另一点:如果在第二种情