访问C联合字段时出现问题

Ton*_*Bai 3 language-interoperability go cgo

我想进入Go的C联盟领域.下面是我的源代码,但编译时遇到错误:

package main

// #include <stdio.h>
// #include <stdlib.h>
// union bar {
//        char   c;
//        int    i;
//        double d;
// };
import "C"

import "fmt"

func main() {
    var b *C.union_bar = new(C.union_bar)
    b.c = 4
    fmt.Println(b)
}
Run Code Online (Sandbox Code Playgroud)

当我建立时,我得到如下错误:

bc undefined(类型*[8]字节没有字段或方法c)

谁能告诉我访问工会领域的正确方法?

zzz*_*zzz 5

对于类型安全,似乎联合被视为[N]字节,N ==最大联合项目的大小.因此,在这种情况下,必须将[Go visible]类型处理为[8]字节.然后它似乎工作:

package main

/*

#include <stdio.h>
#include <stdlib.h>
union bar {
       char   c;
       int    i;
       double d;
} bar;

void foo(union bar *b) {
    printf("%i\n", b->i);
};

*/
import "C"

import "fmt"

func main() {
    b := new(C.union_bar)
    b[0] = 1
    b[1] = 2
    C.foo(b)
    fmt.Println(b)
}
Run Code Online (Sandbox Code Playgroud)
(11:28) jnml@celsius:~/src/tmp/union$ go build && ./union
513
&[1 2 0 0 0 0 0 0]
(11:28) jnml@celsius:~/src/tmp/union$ 
Run Code Online (Sandbox Code Playgroud)

注意:相同的代码会在具有其他字节顺序的计算机上打印不同的数字.