强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构

Posted

技术标签:

【中文标题】强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构【英文标题】:Forced to define Go struct for casting an unsafe.Pointer() to a C struct 【发布时间】:2015-05-29 14:06:55 【问题描述】:

与 C 代码互操作,我无法直接转换结构,我不得不在 Go 中定义一个等效的结构。 libproc.h 的 C 函数是

int proc_pidinfo(int pid, int flavor, uint64_t arg,  void *buffer, int buffersize)

flavor==PROC_PIDTASKINFO 的 C 结构是 proc_taskinfo,在 sys/proc_info.h 中定义(包含在 libproc.h 中):

struct proc_taskinfo 
    uint64_t        pti_virtual_size;   /* virtual memory size (bytes) */
    uint64_t        pti_resident_size;  /* resident memory size (bytes) */
    uint64_t        pti_total_user;     /* total time */
    uint64_t        pti_total_system;
    uint64_t        pti_threads_user;   /* existing threads only */
    uint64_t        pti_threads_system;
    int32_t         pti_policy;     /* default policy for new threads */
    int32_t         pti_faults;     /* number of page faults */
    int32_t         pti_pageins;        /* number of actual pageins */
    int32_t         pti_cow_faults;     /* number of copy-on-write faults */
    int32_t         pti_messages_sent;  /* number of messages sent */
    int32_t         pti_messages_received;  /* number of messages received */
    int32_t         pti_syscalls_mach;  /* number of mach system calls */
    int32_t         pti_syscalls_unix;  /* number of unix system calls */
    int32_t         pti_csw;            /* number of context switches */
    int32_t         pti_threadnum;      /* number of threads in the task */
    int32_t         pti_numrunning;     /* number of running threads */
    int32_t         pti_priority;       /* task priority*/
;

即使 Go 代码确实有效,我也无法直接使用 C.proc_taskinfo。 Go函数为propertiesOf():完整源码here。

如果我引用 C 结构,我会收到与 latest question 中关于该主题的类似错误报告:could not determine kind of name for C.proc_taskinfo,但这次我确定定义是使用 #include 导入的。

【问题讨论】:

【参考方案1】:

根据documentation

要直接访问结构、联合或枚举类型,请在其前面加上 struct_、union_ 或 enum_,如在 C.struct_stat 中。

使用C.struct_proc_taskinfo

【讨论】:

+1 这回答了我的问题,让我对 C/Go 互操作性有了更好的理解。我认为这是在文档中(我查阅过),但是像这样的重要事情应该更清楚地出现(有很多粗体句子......)。 已应用更改(它构建并通过测试),如果有人对完整(学习)项目源感兴趣,可以关注此link。

以上是关于强制定义 Go 结构以将 unsafe.Pointer() 转换为 C 结构的主要内容,如果未能解决你的问题,请参考以下文章

图解Go的unsafe.Pointer

go结构体方法

Go中的struct比较知识点

Golang语言编程规范

go判断interface类型及类型转换

golang结构体组合与“多态” 2021-08-06