在围棋中,我try 使用unsafe库将uint32转换为字节数组(4字节):

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := make([]byte, unsafe.Sizeof(h))
copy(a, *(*[]byte)(unsafe.Pointer(&h)))

前两行是正确的,但是在copy调用时我得到一个运行时错误(unexpected fault address).

下一步是拨打Write

_, err = fi.Write(a)

若要将这4个字节写入文件,请执行以下操作.

我还发现了其他具有类似主题的问题,但没有一个具有工作代码. 我也知道unsafe美元是不安全的.

任何帮助都将不胜感激.

推荐答案

这里有一种方法:

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := (*[4]byte)(unsafe.Pointer(&h))[:]

下面是正在发生的事情的细目.密码

(*[4]byte)(unsafe.Pointer(&h))

将uint32指针转换为[4]字节指针.这个

[:]

在末尾,在[4]字节上创建一个切片.

问题中的代码将uint32解释为slice header.结果切片无效,出现copy个故障.

另一种不使用不安全的方法是使用encoding/binary包:

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := make([]byte, 4)
binary.LittleEndian.PutUint32(a, h)

Go相关问答推荐

T的Golang通用切片,其中 *T实现接口

获取k8s群集作用域运算符的命名空间

正在使用terratest执行terraform脚本测试,但遇到错误退出状态1

如何在gofr发起的服务间调用请求中添加Authorization Header?

Python样式生成器实现为通道:过早读取

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

运行 Docker 容器 - X11 无法打开显示:0

Golang telegram 机器人

3 字节切片和有符号整数类型之间的转换

按位移计算结果中的差异

也许在 golang 中包(字符串和字符串类型不匹配)

使用 Grafana alert 在几分钟内重复alert

如何处理 Go 的 firebase admin sdk 错误?

Golang - 客户 Unmarshaler/Marshaler 在指针上具有 nil/null 值

go:识别重新定义标志的包

Golang泛型在用作 map 元素时不起作用

跟踪长时间运行的任务的进度 - 正确的方法

实现接口的指针的泛型类型是什么?

Dynamodb.ScanInput - 不能使用expr.Names()(类型 map[string]*string)作为类型 map[string]string

从 map 返回空数组而不是空字符串数组