Go语言中uint64的存储与变长编码解析

Go语言中uint64的存储与变长编码解析

go语言中,uint64类型在内存中始终占用8字节存储空间。然而,在使用binary.putuvarint进行变长编码时,一个uint64值最多可能占用10字节。这并非类型存储的矛盾,而是变长编码为了保持兼容性和设计简洁性所做的权衡,通过使用最高有效位作为延续位来指示后续字节。

在Go语言中,基本数据类型的大小是明确且固定的。根据Go语言规范,uint64类型被定义为64位无符号整数,其在内存中的标准存储大小为8字节。这与处理器架构和内存对齐无关,是语言层面的保证。

例如,Go语言的类型大小保证如下:

类型 字节大小

byte, uint8, int81uint16, int162uint32, int32, float324uint64, int64, float64, complex648complex12816

这意味着无论uint64变量存储的值是0、100还是math.MaxUint64,它在程序内存中分配的存储空间都固定是8字节。

变长编码(Varint)与binary.PutUvarint

然而,当涉及到数据的序列化或网络传输时,我们常常会遇到变长编码(Varint)的概念。Varint是一种紧凑的表示数字的方式,对于较小的数字,它会占用较少的字节,而对于较大的数字,它会占用更多的字节。Go语言标准库中的encoding/binary包提供了PutUvarint函数,用于将uint64值编码为Varint格式。

立即学习“go语言免费学习笔记(深入)”;

binary.PutUvarint函数可以将一个uint64值编码到字节切片中,并返回写入的字节数。令人困惑的是,对于一个uint64值,该函数最多可能写入10个字节,而不是通常认为的8字节。

为什么Uvarint会占用更多字节?

这种差异源于Varint编码的设计原则。Varint编码通常使用每个字节的最高有效位(MSB)作为“延续位”:如果MSB为1,表示这个数字还有后续字节;如果MSB为0,表示这是数字的最后一个字节。每个字节的其余7位用于存储实际的数值数据。

对于一个64位的uint64值,它最多需要64位来表示。如果每个字节提供7位有效数据,那么理论上ceil(64 / 7) = 10个字节是足够的。这意味着最坏情况下,一个uint64值需要10个字节来编码。

大师兄智慧家政 大师兄智慧家政

58到家打造的AI智能营销工具

大师兄智慧家政 99 查看详情 大师兄智慧家政

Go语言的binary包中的设计说明对此有详细解释:

// 设计说明:// 64位值最多需要10个字节。编码可以更紧凑:// 一个完整的64位值需要一个额外的字节来保存第63位。// 相反,前一个字节的MSB可以用来保存第63位,// 因为我们知道不会有超过64位。// 这是一个微不足道的改进,可以将最大编码长度减少到9个字节。// 然而,它会打破MSB总是“延续位”的不变性,// 从而使格式与更大数字(例如128位)的Varint编码不兼容。

这段设计说明揭示了关键点:

最高10字节: 为了表示64位数据,并且每个字节只贡献7位有效数据(因为1位是延续位),因此需要10个字节。设计权衡: 理论上,可以通过特殊处理(例如,让最后一个字节的MSB不作为延续位,而是作为第63位数据)将最大编码长度减少到9字节。兼容性与不变性: 然而,Go语言的binary包选择不这样做,是为了保持一个重要的不变性:MSB始终作为延续位。这种设计使得Varint格式能够兼容更大数字的编码(如未来的128位或更多位),而不会引入特殊的边缘情况处理,从而简化了编码和解码逻辑。

示例代码

以下代码演示了uint64在内存中的大小以及binary.PutUvarint的编码行为:

package mainimport (    "encoding/binary"    "fmt"    "unsafe")func main() {    var val uint64 = 12345678901234567890 // 一个较大的uint64值    var smallVal uint64 = 123             // 一个较小的uint64值    // 1. 检查uint64在内存中的大小    fmt.Printf("uint64类型在内存中占用 %d 字节。n", unsafe.Sizeof(val))    // 2. 使用binary.PutUvarint进行编码    buf := make([]byte, binary.MaxVarintLen64) // MaxVarintLen64 为 10    // 编码大值    nBig := binary.PutUvarint(buf, val)    fmt.Printf("值 %d (大值) 编码后占用 %d 字节: %xn", val, nBig, buf[:nBig])    // 编码小值    nSmall := binary.PutUvarint(buf, smallVal)    fmt.Printf("值 %d (小值) 编码后占用 %d 字节: %xn", smallVal, nSmall, buf[:nSmall])    // 编码最大uint64值    maxUint64 := ^uint64(0) // math.MaxUint64    nMax := binary.PutUvarint(buf, maxUint64)    fmt.Printf("值 %d (MaxUint64) 编码后占用 %d 字节: %xn", maxUint64, nMax, buf[:nMax])}

运行上述代码,你会观察到:

uint64类型在内存中占用 8 字节。较大的uint64值和MaxUint64值编码后会占用10个字节。较小的uint64值编码后会占用较少的字节(例如1或2字节)。

总结

理解uint64的存储和Varint编码之间的区别至关重要:

内存存储: 在Go程序运行时的内存中,uint64类型变量始终占用固定的8字节空间。这是类型本身的特性。序列化编码: 当使用binary.PutUvarint等函数进行数据序列化时,采用的是变长编码(Varint)。这种编码方式旨在节省存储空间,对于小数字占用字节少,对于大数字则占用字节多。编码长度: uint64的Varint编码最大可达10字节,这是因为Varint编码每个字节的最高位用作延续位,牺牲了一位数据位,并且为了保持编码格式的通用性和兼容性,Go语言选择了这种设计。

因此,在处理uint64数据时,需要区分其在内存中的静态大小和在序列化(如文件存储、网络传输)时可能采用的动态编码大小。

以上就是Go语言中uint64的存储与变长编码解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1109317.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 12:54:52
下一篇 2025年12月2日 12:55:13

相关推荐

  • 币安binance官网链接 币安交易所官方App下载注册详解

    币安是全球领先的数字资产服务平台,支持BTC、ETH等数百种数字资产交易,提供现货、衍生品、理财等核心功能。用户可通过官方入口访问网站或下载App,注册需手机号或邮箱并设置安全密码,完成验证码验证及KYC认证以保障账户安全。安装App时需根据系统选择对应版本,并在设备中信任应用来源。除币安外,欧易O…

    2025年12月11日 好文分享
    000
  • COOKIE币应用场景拓展_2032年价格潜力评估

    COOKIE币通过用户行为激励、数据贡献奖励和去中心化治理三方面推动MarketingFi生态发展:首先在行为激励中,依托Cookie3 AI记录用户行为并由智能合约按规则发放奖励,确保透明可审计;其次在数据贡献体系中,结合DID系统保障隐私,依数据质量分级奖励,并由DAO评估数据有效性;最后在治理…

    2025年12月11日
    000
  • Cookie币交易量分析_2028-2050年流动性预测

    Cookie币流动性受生态发展与用户参与影响,通过分析两年以上K线数据、评估AI工具应用与DAO治理进展、监控链上地址增长及做市商价差水平综合判断其流动趋势。 Cookie币的交易量与市场流动性受多种因素影响,包括生态发展和用户参与度。 一、分析历史交易数据 通过研究COOKIE币过去几年的交易记录…

    2025年12月11日
    000
  • COOKIE币市场表现评估_2028-2035年投资回报率预测

    COOKIE币价格受平台采用、质押机制和市场扩展影响,历史波动大,2025年预测约0.1664美元,投资回报存在不确定性。 COOKIE币市场表现受多种因素影响,价格波动频繁,投资回报存在不确定性。 一、分析历史价格走势 通过研究COOKIE币过往的价格变动,可以识别潜在的支撑位和阻力位。这有助于理…

    2025年12月11日
    000
  • 稳定币运作机制_抵押类型、监管态度与系统性风险

    稳定币通过法币、加密资产或算法机制维持价格稳定,其运作依赖储备资产与套利平衡,主要类型包括法币抵押型(如USDC)、加密货币抵押型(如DAI)和算法稳定币;全球监管趋严,美国、欧盟等强调储备透明与机构合规,中国则禁止私人稳定币;系统性风险涵盖挤兑、储备资产贬值、市场传染及技术漏洞,唯有高透明与强风控…

    2025年12月11日
    000
  • 什么是比特币(BTC)_BTC价格历史、市场分析与未来展望

    比特币是2009年由中本聪创建的首个去中心化加密资产,基于区块链技术实现安全、匿名交易,总量上限2100万枚。早期价格几近于零,2010年首笔披萨交易赋予其实际价值,2013年突破1000美元。2017年涨至近2万美元,经历2018年寒冬后,2021年因机构入场创下6.9万美元高点。2024年美国批…

    2025年12月11日
    000
  • 了解区块链技术_核心原理、应用场景与发展趋势

    区块链通过去中心化、不可篡改和智能合约等核心技术,实现安全可信的数据管理;广泛应用于金融、供应链、数字身份和知识产权等领域;未来将与AI、物联网融合,跨链技术发展推动企业级应用深化,2025年全球企业支出超400亿美元,监管逐步明晰助力其规模化发展。 了解区块链技术:核心原理、应用场景与发展趋势 区…

    2025年12月11日
    000
  • GAIB币:它是什么?为何值得关注?

    GAIB币是Global Artificial Intelligence Blockchain的缩写,旨在构建去中心化全球AI网络,其原生代币用于支付、激励与治理;采用创新的Proof of Intelligence共识机制,融合AI与区块链技术,赋能去中心化AI应用,降低算力成本,实现数据价值化;…

    2025年12月11日
    000
  • GAIB 币究竟是什么?一文读懂其代币经济与空投机会!

    GAIB币是基于去中心化AI计算网络的数字资产,通过整合全球算力资源与AI模型资产化,构建开放高效的%ignore_a_2%生态;其代币总量固定为100亿枚,40%用于生态系统激励,支持质押、治理、支付及模型奖励等多重用途;当前正进行第二阶段“AI贡献者”空投,用户可通过深度使用AIGen.art、…

    2025年12月11日
    000
  • KGEN币怎么样?会飙升还是崩盘?KGEN价格预测

    KGEN币的价值需从多维度综合评估:首先分析项目基本面,包括技术架构、团队背景及赛道竞争优势;其次考察代币经济模型,关注总供应量、分配机制与实际效用;再者通过社交平台互动与持币地址增长判断社区活跃度;最后结合技术图表中的支撑阻力位、RSI指标与形态结构进行趋势预测。各环节协同分析可提升决策准确性。 …

    2025年12月11日
    000
  • 大陆用户如何注册Bitget交易所账号并进行KYC身份认证?

    1、注册Bitget账户需使用邮箱或手机号,设置密码并通过人机验证和验证码完成注册;2、完成KYC认证需登录账户,选择中国为地区,提交身份证信息及照片,并进行人脸识别,审核通过后提升账户权限。 1、币安Binance 币安Binance官网入口: 币安BinanceAPP下载链接: 2、欧易okx …

    2025年12月11日
    000
  • Hamster Kombat (HMSTR)币是什么?怎么购买?HMSTR价格预测2025-2050年

    hamster kombat 是 telegram 上的一款点击 赚钱游戏,于 2024 年 3 月推出,该游戏追随了 notcoin 的脚步,玩家只需要进行点击即可赚取金币。此外,自其原生代币 hmstr 推出后,玩家可将游戏内的硬币换成有价值的 $hmstr。 Binance币安 欧易OKX ️…

    2025年12月11日 好文分享
    000
  • 什么是XAUT币?怎么买?未来能涨到多少?

    XAUT是由Tether Gold发行的与实物黄金挂钩的数字代币,每枚代表一金衡盎司伦敦合格交割金条的所有权,黄金储存在瑞士金库中并可在线验证。用户可通过中心化交易平台或去中心化协议获取XAUT。 欧易官网: 欧易官方app: 币安官网: 币安官方app: gate.io官网: gate.io官方a…

    2025年12月11日
    000
  • 比特币Layer 2生态爆发:Stacks、Merlin Chain如何为BTC赋能?

    随着比特币生态的蓬勃发展,layer 2解决方案成为绝对焦点。以stacks和merlin chain为代表的项目,正致力于突破比特币的功能限制,为其注入前所未有的活力与应用场景。 正规靠谱的加密货币交易平台推荐: 欧易OKX: Binance币安: 火币Huobi: Gateio芝麻开门: Sta…

    2025年12月11日
    000
  • 比特币交易员是如何套利的?谁在赚走你看不见的钱?套利操作指南

    在加密货币市场里,有一种赚钱方式被称为 “最接近无风险收益的玩法”:套利(arbitrage)。 Binance币安 欧易OKX ️ Huobi火币️ 无论市场涨跌,只要不同平台、不同链之间存在价格偏差,你就有机会利用 低买高卖 的机制迅速锁定利润。 但今天的区块链套利早已不是“手动搬砖”的时代。 …

    2025年12月11日
    000
  • 一文了解欧元稳定币如何解决欧盟的美元担忧

    Binance%ignore_a_1% 欧易OKX ️ Huobi火币️ 欧洲央行担心美元稳定币可能削弱其影响政策的能力,而欧洲发行者对如何解决这一问题有一些想法。 欧盟的中央银行家们正在论证,以美元为支撑的稳定币可能会威胁到他们制定货币政策的能力。 过去一年,稳定币市场蓬勃发展,主要是由于美国的法…

    2025年12月11日
    000
  • 平台币凭什么吸引投资者?深入解析其独特价值与潜在风险

    平台币凭借交易手续费抵扣、参与IEO优先权、社区治理及生态赋能等实用场景,结合平台业绩增长映射与回购销毁通缩模型,形成价值支撑;其价格与平台发展紧密绑定,吸引投资者共享生态红利。然而,亦面临平台安全风险、监管政策不确定及市场竞争加剧等潜在威胁,需审慎评估投资。 平台币凭什么吸引投资者?深入解析其独特…

    2025年12月11日
    000
  • 加密货币基础知识:初学者和投资者的终极指南

    近年来,加密货币已从技术新奇事物发展成为具有全球影响力的金融资产。在此背景下, 加密货币价格 指的是其以传统(法定)货币计价的价格。它已成为大型投资者和充满热情的初学者都关注的重要指标。 Binance币安 欧易OKX ️ Huobi火币️ 你从这篇文章中能学到什么? 如果您想了解加密货币价格波动的…

    2025年12月11日 好文分享
    000
  • 加密货币恐惧与贪婪指数是什么?如何运作与计算?一文介绍

    什么是加密货币恐惧与贪婪指数?本质上,它是一个情绪指标,将市场情绪浓缩成一个介于 0 到 100 之间的数字。它可以帮助交易者识别加密货币价格是由过度恐惧还是过度贪婪驱动的。在当前低迷的市场环境下——恐惧指数通常保持较低水平——追踪市场情绪变得尤为重要,以便捕捉到极端恐慌、投降或复苏的早期迹象。 B…

    2025年12月11日
    000
  • USDT收款地址怎么获取?2025最新教程

    获取USDT收款地址需选择可靠平台,登录后进入资产页面点击充值USDT,关键要选对网络(如TRC20、ERC20或BEP20),确认与付款方一致,再复制或分享生成的地址,并核对开头结尾以防出错。 随着数字经济的不断发展,USDT(Tether)作为一种与美元挂钩的稳定币,因其价值稳定、交易便捷的特点…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信