V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
cyhone
V2EX  ›  Go 编程语言

解读 Golang 标准库里的 varint 实现

  •  1
     
  •   cyhone · 2023-11-23 13:15:13 +08:00 · 1185 次点击
    这是一个创建于 403 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近发现 Golang 标准库竟然自带了 varint 的实现,代码位置在 encoding/binary/varint.go 。刚好借助 golang 标准库的 varint 源码,我们来系统地学习和梳理下 varint 。

    熟悉 protobuf 的人肯定对 varint 不陌生,protobuf 里面除了带 fix (如 fixed32 、fixed64) 之外的整数类型, 都是 varint 编码。

    varint 主要是为了解决两个问题:

    空间效率:以 uint64 类型为例,可以表示的最大值为 18446744073709551615 。然而在实际业务场景中,我们通常处理的整数值远小于 uint64 的最大值。假设在我们的业务中,需要处理的整数值仅为 1 ,但在网络传输过程中,我们却需要使用 8 个字节来表示这个值。这就导致了大量的空间浪费,因为大部分字节并没有实际存储有效的信息。varint 编码通过使用可变长度的字节序列来表示整数,使得小的整数可以用更少的字节表示,提高空间效率。 兼容性:varint 使得我们可以在不改变编码 / 解码逻辑的情况下,处理不同大小的整数。这意味着我们可以在不破坏向后兼容性的情况下,将一个字段从较小的整数类型(如 uint32 )升级到较大的整数类型(如 uint64 ) 本文将通过分析 Golang 标准库自带的 varint 源码实现,介绍 varint 的设计原理以及 Golang 标准库是如何解决 varint 在编码负数时遇到的问题。

    点击查看原文

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1279 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 17:43 · PVG 01:43 · LAX 09:43 · JFK 12:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.