首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在go中正确使用系统( Go unsafe.Sizeof对C大小的不同结果)

如何在go中正确使用系统( Go unsafe.Sizeof对C大小的不同结果)
EN

Stack Overflow用户
提问于 2019-04-13 10:27:08
回答 2查看 398关注 0票数 2

Go的unsafe.Sizeof返回的结果与C的sizeof不同。

main.go:

代码语言:javascript
运行
复制
package main

import (
    "unsafe"
)

type gpioeventdata struct {
    Timestamp uint64
    ID        uint32
}

func main() {
    eventdata := gpioeventdata{}
    println("Size", unsafe.Sizeof(eventdata))
}

当在12上使用env GOOS=linux GOARCH=arm GOARM=6 go build编译并在Raspberry上运行时,打印macOS。

Gpio.c

代码语言:javascript
运行
复制
#include <stdio.h>
#include <linux/gpio.h>

int main() {    
    printf("sizeof gpioevent_data %zu\n", sizeof(struct gpioevent_data));
}

编译并在Raspberry上运行时打印16 (与gcc一起)。

Gpio.h中的结构定义:

代码语言:javascript
运行
复制
struct gpioevent_data {
    __u64 timestamp;
    __u32 id;
};

编辑

我已经认为这是由于对齐,但是很多人将Go结构传递到syscall.Syscall (例如,https://github.com/stapelberg/hmgo/blob/master/internal/gpio/reset.go#L49)。所以这基本上是错误的,你不应该这么做?

如果这是错误的,那么使用go调用syscalls的正确方法是什么,以便在不同的体系结构中正确工作。例如,GPIO ioctl调用:

代码语言:javascript
运行
复制
ret = ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &req);
...
struct gpioevent_data event;
ret = read(req.fd, &event, sizeof(event));
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55664457

复制
相关文章

相似问题

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