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

why is indexing on the slice pointer not allowed in golang

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

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

p := &txs

fmt.Println(p[0])

我想了解为什么不支持在切片指针上建立索引。我可以将指针变量复制到值变量,然后进行索引,但我很想知道为什么该语言不支持切片指针的索引;这样做会非常方便。还是有一种我不知道的方法?请让我知道你的想法。

那里发生了抽象,语言设计者选择不将其应用于指针。给出一些实际原因,这可能是由于指针没有指向数组的开头(如内存块)。如果您熟悉索引,这通常是通过 startingAddress + index * sizeof(dataType)).因此,当您拥有值类型时,它已经提供了一个抽象来隐藏发生的额外间接层。我假设当你有一个指向切片对象的指针时,语言作者认为这样做没有意义,因为它指向实际内存,这会产生误导。它已经引起了一些混乱,但对于很多开发人员来说,他们可能永远不会意识到这种抽象的存在(就像在大多数情况下,在切片与数组上操作时在语法上没有明显的区别)。

写入 (*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