为啥在golang中不允许对切片指针进行索引
Posted
技术标签:
【中文标题】为啥在golang中不允许对切片指针进行索引【英文标题】:why is indexing on the slice pointer not allowed in golang为什么在golang中不允许对切片指针进行索引 【发布时间】:2016-11-22 22:08:44 【问题描述】:当我运行以下代码时,我收到编译器错误,指出不支持索引。
txs := make([]string, 2)
txs[0] = "A"
p := &txs
fmt.Println(p[0])
我试图了解为什么不支持对切片指针进行索引。我可以将指针变量复制到值变量,然后进行索引,但我很好奇为什么该语言不支持切片指针上的索引;这样做会很方便。还是有一种我不知道的方法?请让我知道你的想法。
【问题讨论】:
Slicing a slice pointer passed as argument的相关/可能重复 还有***.com/questions/28709254/… 不允许索引切片指针,就像大多数其他运算符对指针无效一样。指针的类型是独立于底层切片的类型。 @JimB 请注意,允许对指向数组的指针进行索引。请参阅我的链接答案。 @icza: 是的,谢谢,我总是忘记那个 【参考方案1】:写入(*p)
以取消引用指针p
:
package main
import (
"fmt"
)
func main()
txs := make([]string, 2)
txs[0] = "A"
p := &txs
fmt.Println((*p)[0])
游乐场:https://play.golang.org/p/6Ex-3jtmw44
输出:
A
【讨论】:
正是医生所要求的。感谢这个很棒的例子!我被困在那里了。【参考方案2】:那里发生了一个抽象,语言设计者选择不将它应用于指针。给出一些实际的原因,这可能是由于指针不指向数组的开头(如内存块。如果您熟悉索引,这通常使用类似startingAddress + index * sizeof(dataType)
)。因此,当您拥有值类型时,它已经提供了一个抽象来隐藏发生的额外间接层。我认为语言作者认为当你有一个指向 slice 对象的指针时这样做是没有意义的,因为它指向实际的内存,这将是一个相当误导的。它已经引起了一些混乱,但是对于许多开发人员来说,他们可能永远不会意识到这种抽象的存在(就像在大多数情况下,对切片和数组进行操作时语法没有明显差异)。
【讨论】:
以上是关于为啥在golang中不允许对切片指针进行索引的主要内容,如果未能解决你的问题,请参考以下文章
为啥正常的 for 循环允许为结构字段分配值,而 for range 在 Golang 中不起作用? [复制]