小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《如何跨操作系统一致地将 C uint64_t 转换为 Cgo?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!
问题内容我正在使用 go 的一些 c 库,使用 cgo 来处理转换。
我有一个 c 头文件,如下所示:
#include <stdlib.h>
typedef struct {
k uint64_t;
} params;
此结构在 go 中使用,代码如下:
package test
import "c"
func newparams(k uint64) paramets {
return params{
k: c.ulonglong(k),
}
}
该代码在使用 apple clang 版本 12.0.0 的 os x 上编译良好,但在使用 clang 版本 7.1.0 的 linux 上编译失败,产生以下错误:
cannot use _Ctype_ulonglong(k) (type _Ctype_ulonglong) as type _Ctype_ulong in field value
如果我将对 c.ulonglong
的调用更改为 c.ulong
,它在 linux 上工作正常,但在 os x 上失败。
如何确保相同的代码在两个平台上都能运行?
正确答案
使用 go build -work
我能够确认问题源于映射差异:
- 在 Linux 端,C
unit64_t
被映射到C.ulong
- 在 Mac 端,它会映射到
C.ulonglong
请注意,C.ulong
和 C.ulonglong
都映射到 go uint64
,但直接使用 Go 类型并删除 C.xxx(k)
转换会失败。
解决方案是使用 C.uint64_t(k)
,这使得我们正在讨论的类型的大小变得明确。这很好,因为 C 类型无论如何都是 uin64_t
。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何跨操作系统一致地将 C uint64_t 转换为 Cgo?》文章吧,也可关注编程网公众号了解相关技术文章。