ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 OpenShift 测试套件中使用 go-humanize:Go 语言人性化数字、大小与时间的完整实践指南

在 OpenShift 测试套件中使用 go-humanize:Go 语言人性化数字、大小与时间的完整实践指南 测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载导读go-humanize是一个专注于把机器可读的数字变成人可读字符串的 Go 工具库它能把82854982这样的字节数变成83 MB把time.Time变成7 hours ago把193变成193rd还能自动为数字添加千分位逗号。在 openshift/origin 这一 OpenShift 并发测试conformance test套件中该库以 vendor 依赖版本 v1.0.1见 vendor/modules.txt的形式存在用于在测试日志、监控报告与结果输出中生成更易读的耗时、文件大小与数值表述。读完本文你将掌握该库全部核心 API 的用法、底层格式化算法以及 SI/IEC 两种单位体系的取舍并能在自己的 Go 项目中直接复用这些能力。引入方式该库以标准 Go module 方式管理go get获取github.com/dustin/go-humanize后按github.com/dustin/go-humanize导入包内符号以humanize前缀调用顶层函数均位于 humanize.go 声明的humanize包中。在当前仓库中它被冻结在 v1.0.1 并整体放入 vendor 目录所有实现源码均可在 vendor/github.com/dustin/go-humanize/ 下直接阅读与调试。一、Sizes字节大小的人性化SI 与 IEC 双体系这是该库最常用的能力把裸数字字节数转换为带单位的友好字符串。核心函数是Bytes与IBytes二者对同一个输入82854982会给出不同结果fmt.Printf(That file is %s., humanize.Bytes(82854982)) // That file is 83 MB. fmt.Printf(That file is %s., humanize.IBytes(82854982)) // That file is 79 MiB.差异源于进制基准Bytes使用SI 十进制体系每级 1000后缀为B / kB / MB / GB / TB / PB / EB实现见 bytes.go 与常量表 bytes.goIBytes使用IEC 二进制体系每级 1024后缀为B / KiB / MiB / GiB / TiB / PiB / EiB常量定义于 bytes.goByte 1 (iota * 10)。底层格式化算法两者共用humanateBytesbytes.go算法要点小于 10 字节时直接输出N B不做单位换算通过lognmath.Log(n) / math.Log(b)bytes.go计算数量级指数e据此选择后缀数值保留一位小数且当结果小于 10 时才显示小数%.1f %s否则四舍五入为整数%.0f %s——所以 83 MB 不会出现 82.8 这样的冗余精度。反向解析ParseBytesParseBytes把字符串解析回字节数对常见拼写做了宽容忍大小写不敏感支持42 MB、42 mib、42.5 GB、带千分位逗号的1,024 kB等写法。可识别单位表bytesSizeTablebytes.go同时收录了b/kib/kb/mib/mb/...以及省略后缀的ki/k/mi/m/...形式。解析时先扫描数字与小数点/逗号前缀再查表换算未知单位返回unhandled size name错误bytes.go。humanize.ParseBytes(42 MB) // 42000000, nil humanize.ParseBytes(42 mib) // 44040192, nil超越 uint64 极限BigBytes 家族当数值超过uint64可表示范围如磁盘总量、聚合统计时可使用基于math/big的 bigbytes.goBigBytes(b *big.Int)输出 SI 后缀到QBBigIBytes(b *big.Int)输出 IEC 后缀到QiBParseBigBytes(s)反向解析内部用big.Rat做精确乘除避免浮点误差bigbytes.go。二、Times相对时间的口语化表达Time把time.Time转换为相对时间字符串过去时间带ago未来时间带from nowfmt.Printf(This was touched %s., humanize.Time(someTimeInstance)) // This was touched 7 hours ago.分级时间单位时间分档常量定义于 times.goDay 24h、Week 7d、Month 30d、Year 12*30d即一年按 360 天、一月按 30 天估算LongTime 37*Year。分档机制与自定义格式Time内部委托给RelTime(then, time.Now(), ago, from now)最终由CustomRelTime结合默认分档表defaultMagnitudestimes.go完成输出。分档表每个条目是一个RelTimeMagnitude{D, Format, DivBy}D是该档位的阈值上限Format可含%s替换为ago/from now等标签与%d替换为数量DivBy用于把差值换算成正确的计数单位。分档查找使用sort.Search二分定位times.go因此无论时差多大都能稳定落到某一档。例如1 second %s对应1 second ago%d minutes %s对应7 minutes ago。这一机制也意味着你可以传入自定义分档表实现完全属于自己的时间表述规则// 自定义分档2 秒以内显示 just now此后按分钟递增 magnitudes : []humanize.RelTimeMagnitude{ {2 * time.Second, just now, 1}, {time.Hour, %d minutes ago, time.Minute}, // ... } humanize.CustomRelTime(past, future, ago, from now, magnitudes)三、Ordinals序数词后缀Ordinal为整数追加正确的序数后缀源于 golang-nuts 邮件列表讨论0 - 0th 1 - 1st 2 - 2nd 3 - 3rd 4 - 4thfmt.Printf(Youre my %s best friend., humanize.Ordinal(193)) // You are my 193rd best friend.实现要点ordinals.go根据x % 10判断st/nd/rd但显式排除 11、12、13x%100 ! 11等因为 11th、12th、13th 是特例其余一律th。这段代码可直接嵌入业务逻辑例如为测试用例编号、榜单排名生成显示文本。四、Commas千分位逗号Comma为int64添加千分位分隔符负号保留在首位0 - 0 100 - 100 1000 - 1,000 1000000000 - 1,000,000,000 -100000 - -100,000fmt.Printf(You owe $%s.\n, humanize.Comma(6582491)) // You owe $6,582,491.实现采用从低位向高位每三位切分的写法并特判了math.MinInt64无法安全取反直接返回-9,223,372,036,854,775,808comma.go。同一文件comma.go还提供Commaf(v float64)浮点版本基于strconv.FormatFloat(v, f, -1, 64)切分整数部分后从低位补逗号小数部分原样保留Commaf(834142.32) - 834,142.32CommafWithDigits(f, decimals)限制小数位数CommafWithDigits(834142.32, 1) - 834,142.3BigComma(b *big.Int)big.Int版本供超大整数使用。五、Ftoa去掉多余尾零的浮点输出Go 默认的%f格式会固定输出 6 位小数产生2.240000这种噪音Ftoa用FormatFloat(num, f, 6, 64)后经stripTrailingZeros修剪尾零ftoa.go得到干净结果fmt.Printf(%f, 2.24) // 2.240000 fmt.Printf(%s, humanize.Ftoa(2.24)) // 2.24 fmt.Printf(%f, 2.0) // 2.000000 fmt.Printf(%s, humanize.Ftoa(2.0)) // 2配套函数FtoaWithDigits(num, digits)可同时限定小数位数ftoa.go适合在报表中控制输出精度。六、SI notation科学单位前缀格式化SI用 SI 公制前缀nano、micro、milli、kilo、mega、giga…格式化任意量级数值可附加任意单位字符串humanize.SI(0.00000000223, M) // 2.23 nM humanize.SI(1000000, B) // 1 MB humanize.SI(2.2345e-12, F) // 2.2345 pF前缀表与计算规则前缀映射表siPrefixTablesi.go覆盖从qquecto10^-30到Qquetta10^30的完整范围。ComputeSIsi.go的算法是取输入的对数算出指数并向下归整到 3 的倍数保证值落在[1, 1000)特殊处理value 1000.0的边界进位到下一档避免输出1000 k保留输入符号math.Copysign零值返回(0, )。输出时默认复用Ftoa去掉尾零SIWithDigits(input, decimals, unit)则限制小数位SIWithDigits(2.2345e-12, 2, F) - 2.23 pF。反向解析ParseSIParseSI(2.2345 pF)返回(2.2345e-12, F, nil)。解析正则riParseRegex在init()中由前缀表动态拼接而成si.go配合反向前缀表revSIPrefixTable每个前缀预计算为10^指数的乘数si.go实现字符串到数值的还原。七、English-specific英语复数与词序列english 子包README 中还介绍了位于humanize/english子包的两个英语专用功能用于生成符合英语语法的展示文本。复数化PluralWord返回单词本身Plural返回数字 单词的完整短语english.PluralWord(1, object, ) // object english.PluralWord(42, object, ) // objects english.PluralWord(2, bus, ) // buses english.PluralWord(99, locus, loci) // loci english.Plural(1, object, ) // 1 object english.Plural(42, object, ) // 42 objects english.Plural(2, bus, ) // 2 buses english.Plural(99, locus, loci) // 99 loci第三个参数允许传入不规则复数形式如locus - loci未提供时按常规规则加s、bus - buses等处理。需要注意的是当前仓库 vendored 的 v1.0.1 快照中并未包含english子包目录vendor/github.com/dustin/go-humanize/ 下仅有主包源码如项目内需要使用该功能需在引入依赖时额外保留相应子包。词序列WordSeries把切片元素用逗号和连接词拼成一句话OxfordWordSeries额外在最后一项前加牛津逗号english.WordSeries([]string{foo}, and) // foo english.WordSeries([]string{foo, bar}, and) // foo and bar english.WordSeries([]string{foo, bar, baz}, and) // foo, bar and baz english.OxfordWordSeries([]string{foo, bar, baz}, and) // foo, bar, and baz这一组合非常适合在测试套件的汇总信息中生成 X, Y and Z 形式的失败组件列表。八、在 OpenShift 测试套件中的典型落地场景基于上述 API 的能力可以推断该依赖在 openshift/origin 这类大规模测试套件中的典型使用位置耗时统计humanize.Time/RelTime把集群启动、升级、用例执行的绝对时间戳转换为35 minutes ago式的相对描述写入测试日志与监控事件便于人工快速定位时间线资源与日志大小Bytes/IBytes格式化 pod 日志体积、磁盘用量、指标采样量使测试报告中的数字直观可读统计数值Comma/Ftoa用于 e2e 结果汇总、API 调用计数等大数输出避免1000000000式的长串数字降低报告可读性。在自行集成时建议按需选用常规字节数与时间展示用BytesTime即可涉及超大数值的聚合统计优先BigBytes/BigComma基于math/big无精度溢出风险需要机器反向读取用户输入时配合ParseBytes/ParseSI形成格式化—解析闭环。总结go-humanize 以极小的 API 面覆盖了大小、时间、序数、千分位、浮点与 SI 前缀六类人性化需求且每一类都提供了格式化与反向解析的完整闭环。其实现bytes.go、times.go、comma.go、si.go、bigbytes.go对数量级计算、边界值MinInt64、11/12/13 序数、1000.0 进位都有细致处理可以直接作为人机友好展示层的参考实现或直接复用。赞分享测试云原生质量保障【免费下载链接】originConformance test suite for OpenShift项目地址https://gitcode.com/gh_mirrors/or/origin点击查看免费下载相关推荐OpenCloud 项目中的 go-humanizeGo 语言人性化数字、字节大小与相对时间格式化实战指南OpenCloud 项目中的 go humanizeGo 语言人性化数字、字节大小与相对时间格式化实战指南 github.com/dustin/go huma后端微服务存储认证鉴权go-humanize 使用指南在 Hyperledger Fabric 中实现人性化的数字、容量与时间格式化go humanize 使用指南在 Hyperledger Fabric 中实现人性化的数字、容量与时间格式化 导读 Hyperledger Fabric 在区块链密码学OpenShift 测试套件中的 Azure Container Service Go SDKarmcontainerservice v4使用指南OpenShift 测试套件中的 Azure Container Service Go SDKarmcontainerservice v4使用指南 导读 a测试云原生质量保障创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表