Go的unsafe.Sizeof返回的结果与C的sizeof不同。
main.go:
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
#include <stdio.h>
#include <linux/gpio.h>
int main() {
printf("sizeof gpioevent_data %zu\n", sizeof(struct gpioevent_data));
}编译并在Raspberry上运行时打印16 (与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调用syscalls的正确方法是什么,以便在不同的体系结构中正确工作。例如,GPIO ioctl调用:
ret = ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &req);
...
struct gpioevent_data event;
ret = read(req.fd, &event, sizeof(event));https://stackoverflow.com/questions/55664457
复制相似问题