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