字节数转换为 KB、MB、GB 等更易读的格式

1
2
3
4
5
6
7
8
9
10
11
12
func formatBytes(b uint64) string {
const unit = 1024
if b < unit {
return fmt.Sprintf("%d B", b)
}
div, exp := unit, 0
for n := b / unit; n >= unit; n /= unit {
div *= unit
exp++
}
return fmt.Sprintf("%.2f %cB", float64(b)/float64(div), "KMGTPE"[exp])
}

这段 Go 语言代码定义了一个 formatBytes 函数,用于将字节大小(uint64 类型)转换为易读的字符串格式,例如 1.23 KB、4.56 GB 等。具体逻辑如下:

单位定义

使用二进制单位(1024 进位),默认单位为 B(字节)。

  • 单位后缀列表 "KMGTPE" 依次对应:
    • K (KiB = 1024¹)
    • M (MiB = 1024²)
    • G (GiB = 1024³)
    • T (TiB = 1024⁴)
    • P (PiB = 1024⁵)
    • E (EiB = 1024⁶)

小字节直接饭回

1
2
3
if b < unit {
return fmt.Sprintf("%d B", b)
}

动态选择最大单位

通过循环找到最大的合适单位,这也是这个函数的核心部分

1
2
3
4
for n := b / unit; n >= unit; n /= unit {
div *= unit
exp++
}

假设 b = 3*1024³(即 3 GiB):

  1. 初始状态

    • div = 1024(单位基数从 KB 开始)
    • exp = 0(单位索引对应 K)
  2. 第一次循环

    • n := b / unit = (3*1024³) / 1024 = 3*1024² → n = 3*1024²
    • 检查条件 n >= unit → 3*1024² >= 1024 → 成立
    • 执行循环体:
      • div *= 1024 → div = 1024²(现在基数对应 MB)
      • exp++ → exp=1(索引现在指向 M)
    • 更新 n = 3*1024² / 1024 = 3*1024 → n=3072
  3. 第二次循环

    • 检查条件 n >= unit → 3072 >= 1024 → 成立
    • 执行循环体:
      • div *= 1024 → div = 1024³(基数对应 GB)
      • exp++ → exp=2(索引指向 G)
    • 更新 n = 3072 / 1024 = 3
  4. 第三次循环

    • 检查条件 n >= unit → 3 >= 1024 → 不成立
    • 循环终止

格式化结果

1
return fmt.Sprintf("%.2f %cB", float64(b)/float64(div), "KMGTPE"[exp])

将字节数除以单位基数(div),并附加对应的单位符号,保留两位小数。


字节数转换为 KB、MB、GB 等更易读的格式
https://sunshinechen.cn/2025/11/07/字节数转换为 KB、MB、GB 等更易读的格式/
作者
sunshine
发布于
2025年11月7日
许可协议