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的可变长编码结果
- 第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
相关产品推荐
相关产品推荐

