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)
谁能告诉我访问工会领域的正确方法?
对于类型安全,似乎联合被视为[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)
注意:相同的代码会在具有其他字节顺序的计算机上打印不同的数字.