
在 go 中,`string(int(c.int))` 会将整数解释为 unicode 码点(rune),而非十进制数字字符串;若需输出如 `"2"` 而非 `"\u0002"`,应使用 `strconv.itoa` 或 `fmt.sprintf("%d", ...)`。
当你在 Go 中调用 string(int(C.SomeEnumValue)) 时,Go 并不会将其视为“把数字转成字符串表示”,而是将其当作一个 Unicode 码点(rune)来构造字符串。例如:
cVal := C.SomeEnumThird // 假设其值为 2 s := string(int(cVal)) // ❌ 结果是 "\u0002"(即 U+0002,控制字符 STX),不是 "2"
这是因为 string(rune) 构造函数的语义是:将一个 Unicode 码点转换为对应字符的字符串,而非格式化整数。int(2) 传给 string() 后,等价于 string(2),即生成包含单个控制字符 \x02 的字符串,而非可读的数字字符串 "2"。
import "strconv"
s := strconv.Itoa(int(cVal)) // ✅ 输出 "2"
// 或
import "fmt"
s := fmt.Sprintf("%d", int(cVal)) // ✅ 同样输出 "2"⚠️ 注意事项:
- strconv.Itoa 专用于 int → string 的十进制转换,性能最优,推荐首选;
- 若 C.int 在 64 位系统上可能超出 int 范围(如 C.long 显式为 int64),请先显式转换为 int64 再用 strconv.FormatInt;
- 切勿依赖 string(n) 表示数字字符串——它只适用于 n 是合法 Unicode 码点(0–0x10FFFF)且你确实需要该字符的场景。
总结:C 枚举值本质是整数,在 Go 中需通过数值格式化(而非 rune 构造)转为人类可读的数字字符串。牢记 string(n) ≠ "n",它是 string(rune(n)),语义完全不同。










