为啥在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 中不起作用? [复制]

goLang实现不同类型的切片间互转

golang Golang Snippet - 使用不安全指针进行切片变异

GoLang中的切片扩容机制

Golang中数组和切片的区别与联系

golang-101-hacks(12)——切片作为函数参数传递