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

时间:2012-09-25 08:41:08

标签: go language-interoperability cgo

我想访问Go中的C union字段。下面是我的源代码,但编译时遇到错误:

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)
}

当我构建时,我遇到如下错误:

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

谁能告诉我访问工会字段的正确方法?

1 个答案:

答案 0 :(得分: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)
}

(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$ 

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