为什么在golang中不允许对切片指针进行索引

时间:2016-07-19 20:49:33

标签: pointers go slice

当我运行以下代码时,我收到编译器错误,指出不支持索引。

txs := make([]string, 2)
txs[0] = "A"

p := &txs

fmt.Println(p[0])

我试图理解为什么不支持对切片指针进行索引。我可以将指针变量的副本复制到值变量然后进行索引,但我很想知道为什么语言不支持切片指针的索引;这样做很方便。或者有没有办法做到我不知道?请让我知道你的想法。

2 个答案:

答案 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和数组上操作时语法没有明显区别)。