互操作
边界数据类型
使用与 Go 兼容的 aggregate 布局、多返回值与 GC 安全 variant。维护者C2Go contributorsC2Go 为少量 Go aggregate 值定义了 C 表示。在 64 位 target 上,这些布局可以按值跨越边界。
内建 aggregate
| C 类型 | Go 值 | 64 位布局 |
|---|---|---|
c2go_slice |
[]T |
data、length、capacity |
c2go_string |
string |
data、length |
c2go_iface |
interface | table、data |
c2go_error |
error |
与 interface 相同的两个字 |
__c2go_intptr 是这些定义使用的、与指针同宽的有符号 Go int。
这些值只描述 ABI 布局,不等于完整 Go 语言语义。当前 C2Go 没有为 c2go_iface 提供动态 interface method dispatch 的 C 语法或辅助 API;需要调用某个方法时,应在 Go 侧提供具名 wrapper,再用 c2go_linkname 绑定这个静态符号。
多返回值
当 Go 函数返回多个值时,用完整 struct 配合 c2go_returntype:
struct ReadResult {
c2go_slice bytes;
c2go_error error;
};
extern struct ReadResult go_read(c2go_string path)
c2go_linkname("example.com/files.Read")
c2go_returntype(struct ReadResult);
每个字段映射一个 Go result slot,函数声明的返回类型必须与注解中的 struct 完全一致。
GC 兼容 union
c2go_variant 请求一种 Go GC 能推理的表示:
union __attribute__((c2go_variant)) Number {
int integer;
float real;
};
该属性只适用于 union。无法安全消歧的重叠指针成员会被拒绝;它并不允许任意 pointer punning。
如果需要检索普通 C 语法和 C2Go 特有拼写,请继续阅读 C 语言速查。