首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将指向某个值的指针用作切片

问将指向某个值的指针用作切片
EN

Stack Overflow用户
提问于 2012-08-26 21:16:42
回答 3查看 164关注 0票数 0

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

例如,我想将io.Reader中的单个字节读取到uint8变量中。io.Reader.Read接受切片作为其参数,因此我不能像在C中那样简单地为它提供指向我的变量的指针。

我认为从指针创建一个长度为1,容量为1的切片是安全的操作。显然,它应该与从长度为1的数组创建切片相同,这是允许的操作。有没有一种简单的方法可以用普通的变量来做到这一点?或者我不理解一些东西,为什么禁止这样做是有原因的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-26 22:33:24

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

代码语言:javascript
复制
struct {
  ptr *uint8
  len int
  cap int
}

因此,是的,您将需要创建一个切片。创建var a uint8片段的最简单方法是使用[]uint8{a}

代码语言:javascript
复制
a := uint8(42)
fmt.Printf("%#v\n", []uint8{a})

(但在重读你的问题后,这并不是所有的解决方案)

但是,如果您希望从变量创建切片,并指向相同的内存空间,则可以使用unsafe包。这很可能是不被鼓励的。

代码语言:javascript
复制
fmt.Printf("%#v\n", (*[1]uint8)(unsafe.Pointer(&a))[:] )
票数 2
EN

Stack Overflow用户

发布于 2012-08-26 22:50:40

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-27 15:11:04

当我想向io.Reader提供一个变量时,我找到了一种克服这种情况的方法。Go标准库太棒了!

代码语言:javascript
复制
import (
    "io"
    "encoding/binary"
)

...

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12130428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档