
currency Amount结构体入门Go实现Fowler Money模式的简单方法【免费下载链接】currencyCurrency handling for Go.项目地址: https://gitcode.com/gh_mirrors/cu/currency 本文带你快速上手 Go 语言货币处理开源库currencyCurrency handling for Go。它的核心Amount结构体以值语义实现了 Fowler 在《企业应用架构模式》中提出的Money 模式让你用真实十进制而非 float安全地进行币种金额计算、换算与格式化数据仅约 40KB基于 CLDR v48。一、为什么金额不能用 float在 Go 里处理金额新手最常见的坑就是直接用float64❌0.1 0.2 0.30000000000000004浮点误差会累积❌ 不同货币的小数位数不同USD 是 2 位JPY 是 0 位KWD 是 3 位❌ 数据库里用「整数最小货币单位」存储多币种排序和子单位精度都会变复杂currency库的解决方案Amount结构体内部封装了任意精度十进制类型cockroachdb/apd把「数字 币种代码」绑定在一起从类型层面杜绝了这些错误。这也是 Fowler Money 模式的核心思想——金额不是纯数字而是数字与币种的组合体。二、快速开始3 步用上 Amount 结构体1️⃣ 安装git clone https://gitcode.com/gh_mirrors/cu/currency2️⃣ 创建金额amount, _ : currency.NewAmount(275.98, EUR) fmt.Println(amount) // 275.98 EURNewAmount会校验数字格式与币种代码非法输入返回明确的错误InvalidNumberError/InvalidCurrencyCodeError而不是让你带着脏数据继续跑。3️⃣ 金额运算total, _ : amount.Mul(4) // 乘法 result, _ : total.Add(amount) // 加法值语义的关键Add、Sub、Mul、Div都不会修改原金额而是返回新的Amount就像 Go 的字符串和整数一样。这让代码天然并发安全、无副作用。三、Money 模式的精髓币种不匹配会被拦下来Money 模式最重要的一条规则不同币种的金额不能直接运算。currency用MismatchError帮你自动守住这条线usd, _ : currency.NewAmount(10, USD) eur, _ : currency.NewAmount(10, EUR) usd.Add(eur) // 返回 MismatchError而不是算出一个错误结果但库也很聪明——零值金额是通用货币空值Amount可以加到任意币种上结果为对方金额或从任意币种中减去结果为负数。累加器场景可以写得非常干净var sum currency.Amount // 零值 通用货币 for _, item : range items { sum, _ sum.Add(item.Price) // 直接累加无需判断币种 }四、常用 API 速查表方法作用示例输出Number()取数字部分24.49CurrencyCode()取币种代码USDConvert(code, rate)按汇率换算币种20.99 USD → 19.1009 EURRound()按该币种小数位四舍五入12.345 USD → 12.35RoundTo(digits, mode)自定义位数与舍入模式12.345 → 12Cmp/Equal比较两个金额币种不同必不相等—IsZero/IsPositive/IsNegative正负零判断—Int64()/BigInt()转为最小货币单位整数24.49 USD → 2449五、实战技巧格式化、JSON 与数据库多语言格式化配合FormatterLocale同一金额在不同语言下自动显示为1 103,92 €法语或ریال ۵۰٬۲۷۰波斯语含本地数字amount, _ : currency.NewAmount(275.98, EUR) total, _ : amount.Mul(4) locale : currency.NewLocale(fr) formatter : currency.NewFormatter(locale) fmt.Println(formatter.Format(total)) // 1 103,92 €JSON 序列化Amount实现了json.Marshaler序列化结果为{number:24.49,currency:USD}反序列化时会重新校验币种前端接口对接零成本。PostgreSQL 复合类型实现了driver.Valuer与sql.Scanner金额可作为(NUMERIC, TEXT)复合类型直接存取配合 pgx 驱动一行Scan搞定。六、项目文件导读 想深入源码几个关键文件值得关注amount.go——Amount结构体定义与全部运算方法NewAmount、Add、Convert、RoundTo等currency.go—— 币种信息查询IsValid、GetDigits、GetSymbol、ForCountryCode国家→币种映射formatter.go—— 金额格式化与解析器支持会计风格、正号前缀、分组开关等locale.go—— 地区Locale处理与父级回退链data.go—— 基于 CLDR 的精简币种数据约 40KBexample_test.go—— 最好的「活文档」每个方法都有可运行的示例bench_test.go—— 性能基准测试可以看到Amount运算的开销极低七、总结✅真实十进制告别 float 误差底层是任意精度十进制类型 ✅Money 模式落地值语义 币种不匹配自动拦截金额运算安全无副作用 ✅零值即通用货币累加、差值场景代码极简 ✅全链路支持从运算、换算、舍入到国际化格式化、JSON、数据库存储如果你正在用 Go 写电商、支付或任何涉及钱的功能currency的Amount结构体值得放进你的工具箱——几行代码换回一整年的安心。【免费下载链接】currencyCurrency handling for Go.项目地址: https://gitcode.com/gh_mirrors/cu/currency创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考