限制与支持
平台与当前限制
检查已发布平台矩阵、不支持的语言形状和 fail-closed ABI 边界。维护者C2Go contributors编译器实现覆盖和已发布 SDK 覆盖是不同结论。选择受支持宿主包时,应以 release asset 列表为准。
已发布 SDK
当前协同 release 发布并验证:
| 宿主 | 架构 | Target triple |
|---|---|---|
| Linux | amd64 | x86_64-unknown-linux-goabi |
| Linux | arm64 | aarch64-unknown-linux-goabi |
| Windows | amd64 | x86_64-pc-windows-goabi |
| macOS | arm64 | aarch64-apple-darwin |
每个平台包只能在对应宿主上运行,生成产物也与 (GOOS, GOARCH) 绑定。
其他 codegen 路径
除 release matrix 外,编译器还包含 Darwin amd64 codegen 路径。Windows arm64 目前只能视为不完整的实验路径:简单输入可以写出标记为 windows/arm64 的 manifest,但当前 c2go_extern 仍会报告该 target 不支持对应 calling convention。它不是可用组合,也没有 SDK 或完整 release gate。
边界能力矩阵
| 特性 | Unix | Windows |
|---|---|---|
| Go 调用:标量、浮点、指针 | 支持 | 支持 |
| 导出 C 函数与 record | 支持 | 支持 |
| 原生导入:标量、指针、浮点 | 支持 | 支持 |
| 原生导入:小 record 按值 | 在 ABI 限制内支持 | 按 Win64 size 规则支持 |
| Callback:标量与指针 | 支持 | 支持 |
| Callback:float 或 double | 支持 | fail closed |
| Callback:部分小 record | 支持 | fail closed |
| 多返回值 | 支持合法单 slot 字段 | 支持合法单 slot 字段 |
“Fail closed” 表示工具链会拒绝不支持的形状,而不是静默生成错误调用。
语言硬限制
- 只支持 C 和 64 位;C++ 会被拒绝。
- 拒绝 variable-length array 与动态
alloca,因为可移动 Go 栈使它们的基址不健全。 - Packed 或自定义 alignment 的 managed record 只产生 warning,生成布局与 target 相关;包含扫描 data pointer 的 unmanaged record 会直接拒绝这些布局。
c2go_iface只提供 ABI 表示;当前没有动态调用 interface method 的 C 侧 API。应绑定具名 Go wrapper。c2go_variant不能表示有歧义的重叠 managed pointer。c2go_returntype的每个字段必须占据一个受支持 Go ABI result slot。- Callback operand 必须命名 C2Go 函数;裸 C2Go function pointer 不能传入 native callback slot。
候选版本状态
当前二进制尚未签名。macOS 压缩包没有 notarize,Windows 可执行文件没有 Authenticode 签名。当前支持 Go 1.25.x 与 1.26.x;Go 1.27 及以上在中央 provider 完成验证前会 fail closed。1.0 之前 interface、manifest field 与 ABI epoch 都可能变化。
遇到不支持的形状时,应把边界降低为更简单的形式,例如不按值传递大 record,而是传递指向所有权明确内存的指针,并为准备发布的每个 target 添加测试。
故障排查会把常见诊断映射到具体阶段。