我想访问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)
谁能告诉我访问工会字段的正确方法?
答案 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$
注意:相同的代码会在具有其他字节顺序的计算机上打印不同的数字。