是否可以将指向某个值的指针转换为切片?
例如,我想从变量中读取单个io.Reader
字节uint8
。io.Reader.Read
接受一个切片作为它的参数,所以我不能像在 C 中那样简单地为它提供一个指向我的变量的指针。
我认为从指针创建长度为 1、容量为 1 的切片是安全操作。显然,它应该与从长度为 1 的数组创建切片相同,这是允许的操作。有没有一种简单的方法可以用普通变量来做到这一点?或者也许我不明白某些事情,并且有理由禁止这样做?
切片不仅仅是一个指针,就像 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))[:] )
与其(过度)复杂化这个琐碎的任务,为什么不使用简单的解决方案呢?即传递 .Read 一个长度为 1 的切片,然后将其第零个元素分配给您的变量。
当我想向io.Reader
. Go 标准库很棒!
import (
"io"
"encoding/binary"
)
...
var x uint8
binary.Read(reader, LittleEndian, &x)
作为副作用,这适用于任何基本类型,甚至适用于一些非基本类型。