当我运行以下代码时,我收到编译器错误,指出不支持索引。
txs := make([]string, 2)
txs[0] = "A"
p := &txs
fmt.Println(p[0])
我试图理解为什么不支持对切片指针进行索引。我可以将指针变量的副本复制到值变量然后进行索引,但我很想知道为什么语言不支持切片指针的索引;这样做很方便。或者有没有办法做到我不知道?请让我知道你的想法。
答案 0 :(得分:3)
写入(*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
答案 1 :(得分:0)
那里有一个抽象,语言设计者选择不将它应用于指针。为了给出一些实际的原因,这可能是因为指针没有指向数组的开头(就像内存块一样。如果你熟悉索引,这通常是用{{1}来完成的。 }})。因此,当您拥有值类型时,它已经提供了一个抽象来隐藏发生的额外的间接层。我假设当你有一个指向切片对象的指针时,语言作者并不认为这样做是有道理的,因为它指向实际的内存,这将是一个非常误导。它已经引起了一些混乱,但是对于很多开发人员来说,他们可能永远不会意识到这种抽象存在(就像在大多数情况下,在切片vs和数组上操作时语法没有明显区别)。