为什么在 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
当我 运行 下面的代码时,我收到编译器错误,指出不支持索引。
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