You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go gob编码整数时类型ID与值为预期2倍的问题咨询

Gob编码值翻倍现象的成因

你观测到的类型ID、编码值均为文档标注值2倍的情况,是遗漏了gob的整数编码前置规则导致的,不属于编码异常。

  • gob对所有整数类值(包括类型标识ID、实际传输的整数字段)做可变长编码前,会统一执行左移1位的预处理:无符号整数直接做uint(i) << 1运算(等价于原值乘2);有符号整数会先转换为无符号补码表示再左移,空出的最低位专门用来标记数值正负。
  • 文档中标注的int类型ID为2,经过左移1位计算后得到4,正好匹配你测试结果中类型标识位置的字节值;bool类型文档标注ID为1,左移后得到2,和你测试观测到的bool类型ID结果完全一致。
  • 你运行示例代码编码int(1)时,原始值1左移1位后得到2,对应缓冲区最后一个字节的2,最终输出的[3 4 0 2]完全符合编码规则:
    • 第1字节3:表示后续payload长度为3字节
    • 第2字节4:左移后的int类型ID
    • 第3-4字节0 2:左移后的数值1的可变长编码结果

你可以用下面的代码验证规则:

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "log"
)

func main() {
    var buf bytes.Buffer      
    enc := gob.NewEncoder(&buf) // 写入缓冲区
    // 编码值
    err := enc.Encode(int(1))
    if err != nil {
        log.Fatal("encode error:", err)
    }

    fmt.Println(buf.Bytes())
}

补充说明:你之前提到编码整数7得到[3 4 0 2]属于笔误,按照规则整数7左移1位后为14,对应编码值部分的字节应为0 14。

内容的提问来源于stack exchange,提问作者Pierre Beugnet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 14:31:00