0

是否可以将指向某个值的指针转换为切片?

例如,我想从变量中读取单个io.Reader字节uint8io.Reader.Read接受一个切片作为它的参数,所以我不能像在 C 中那样简单地为它提供一个指向我的变量的指针。

我认为从指针创建长度为 1、容量为 1 的切片是安全操作。显然,它应该与从长度为 1 的数组创建切片相同,这是允许的操作。有没有一种简单的方法可以用普通变量来做到这一点?或者也许我不明白某些事情,并且有理由禁止这样做?

4

3 回答 3

2

切片不仅仅是一个指针,就像 C 中的数组一样。它还包含数据的长度和容量,如下所示:

struct {
  ptr *uint8
  len int
  cap int
}

所以,是的,你需要创建一个切片。创建切片的最简单方法var a uint8[]uint8{a}

a := uint8(42)
fmt.Printf("%#v\n", []uint8{a})

(但是在重新阅读您的问题之后,这并不是一个解决方案)

但是如果你想从变量创建切片,指向相同的内存空间,你可以使用unsafe包。这是最有可能被劝阻的。

fmt.Printf("%#v\n", (*[1]uint8)(unsafe.Pointer(&a))[:] )
于 2012-08-26T14:33:24.160 回答
1

与其(过度)复杂化这个琐碎的任务,为什么不使用简单的解决方案呢?即传递 .Read 一个长度为 1 的切片,然后将其第零个元素分配给您的变量。

于 2012-08-26T14:50:39.910 回答
1

当我想向io.Reader. Go 标准库很棒!

import (
    "io"
    "encoding/binary"
)

...

var x uint8
binary.Read(reader, LittleEndian, &x)

作为副作用,这适用于任何基本类型,甚至适用于一些非基本类型。

于 2012-08-27T07:11:03.550 回答