Go'sunsafe.Sizeof返回的结果与 C's 不同sizeof。
main.go:
package main
import (
"unsafe"
)
type gpioeventdata struct {
Timestamp uint64
ID uint32
}
func main() {
eventdata := gpioeventdata{}
println("Size", unsafe.Sizeof(eventdata))
}
12在 macOS 上编译env GOOS=linux GOARCH=arm GOARM=6 go build并在 Raspberry Pi Zero 上运行时打印。
gpio.c:
#include <stdio.h>
#include <linux/gpio.h>
int main() {
printf("sizeof gpioevent_data %zu\n", sizeof(struct gpioevent_data));
}
16在 Raspberry 上编译和运行时打印(带有gcc)。
gpio.h 中的结构定义:
struct gpioevent_data {
__u64 timestamp;
__u32 id;
};
编辑
我已经认为这是由于对齐,但是很多人将 Go 结构传递给syscall.Syscall(例如https://github.com/stapelberg/hmgo/blob/master/internal/gpio/reset.go#L49)。所以这基本上是错误的,你不应该这样做吗?
如果那是错误的,那么使用 go 调用系统调用的正确方法是什么,以便在不同的体系结构中正常工作。例如 GPIO ioctl 调用:
ret = ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &req);
...
struct gpioevent_data event;
ret = read(req.fd, &event, sizeof(event));