Go中无标准Fill函数,数字补零用fmt.Sprintf("%03d", n),字符串填充需手动实现或用strings.Repeat,自定义StrPad易出边界与rune安全问题。

Fill 不是 Go 标准库中用于“字符串或数字补齐”的函数名 —— 这是常见误解。Go 没有叫 Fill 的通用填充函数,更不存在一个能自动处理“前导零”“左右对齐”“字符重复填充”的万能 Fill。
真正管用的,就两个方向:
- 数字转字符串补零 → 用
fmt.Sprintf配%0xd - 字符串手动补长 → 自己写逻辑,或用第三方工具(如
strings.Repeat+ 拼接)
为什么 fmt.Sprintf("%03d", n) 是最常用解法
它轻量、无依赖、编译期确定行为,且语义清晰:
-
%03d中的0表示用零填充,3是最小宽度,d是十进制整数 - 输入
n = 7→ 输出"007";n = 1234→ 输出"1234"(不截断) - 不支持负数自动补零(
-7会输出"-007"),如需过滤,得先取绝对值或加判断 - 性能好:底层走 fast-path,比拼接字符串快一个数量级
strings.Repeat 能不能凑合做左/右填充
可以,但得自己算长度、拼顺序,容易漏边界:
立即学习“go语言免费学习笔记(深入)”;
- 左补零:
strings.Repeat("0", width-len(s)) + s,前提是s是字符串且len(s) - 右补零:
s + strings.Repeat("0", width-len(s)) - 风险点:如果
s含中文或 emoji,len(s)返回字节长度而非 rune 数,可能错算(比如"??"占 4 字节,但视觉上是 1 个字符) - 没内置 trim 或截断逻辑,超长时不会自动处理,得额外
if len(s) > width { s = s[:width] }
自定义 StrPad 函数要注意什么
网上流传的 StrPad 实现(如 CSDN 那版)看似灵活,但实际用起来有几个硬伤:
- 填充字符串
padString被当作“原子块”重复,无法真正按字符粒度填充(比如想用"0"补 5 位,结果传了"00000000"反而溢出) -
padType只支持"LEFT"和默认右填,没处理居中、截断、rune 安全等真实需求 - 没有对
padLength做负数/零校验,传0或负值可能 panic 或返回空串 - 内部用
for i := 1; i ,当 <code>padStringLen == 0(空字符串)时直接死循环
真正需要多模式填充时,别硬套 StrPad,优先考虑 fmt.Sprintf 处理数字,strings.Repeat + utf8.RuneCountInString 处理含 Unicode 的字符串,复杂场景再封装。


















