Golang源码分析-strconv
📦 1️⃣ 包概述和设计目标
strconv
包的主要功能:
提供字符串与基本数据类型(int、uint、float、bool)之间的双向转换。
特别是:
-
string → int / uint / float / bool (解析、转为数字、检查格式)
-
int / uint / float / bool → string (格式化为文本、支持不同进制、不同小数位)
它被设计为: ✅ 高性能(大量用到位运算、整数优化) ✅ 零依赖(几乎不依赖其他包) ✅ 兼顾人类可读与机器效率
📑 2️⃣ 主要类型和函数
strconv
中没有复杂结构体,主要提供函数。
🔶 整数相关
函数 | 说明 |
---|---|
Atoi(s string) (int, error) | 字符串 → int |
Itoa(i int) string | int → 字符串(十进制) |
ParseInt(s, base, bitSize) | 任意进制字符串 → int64 |
FormatInt(i int64, base) | int64 → 任意进制字符串 |
ParseUint / FormatUint | 类似,针对无符号整数 |
🔶 浮点相关
函数 | 说明 |
---|---|
ParseFloat(s string, bitSize) | 字符串 → float32/float64 |
FormatFloat(f, fmt, prec, bitSize) | float → 字符串 |
🔶 布尔相关
函数 | 说明 |
---|---|
ParseBool(s string) | 字符串 → bool |
FormatBool(b bool) | bool → 字符串 |
🔶 其他
函数 | 说明 |
---|---|
Quote(s) / QuoteToASCII(s) | 对字符串加引号、转义 |
Unquote(s) | 解析带引号的字符串 |
🔍 3️⃣ 核心函数源码分析
我挑几个经典函数细解源码。
🔸 Atoi
和 Itoa
Atoi
本质就是 ParseInt
的封装。
func Atoi(s string) (int, error) { i64, err := ParseInt(s, 10, 0) if err != nil { return 0, err } return int(i64), nil }
-
细节:
-
base=10
,只处理十进制。 -
bitSize=0
→ 根据int
平台位宽自动选择。
-
🔸 ParseInt
func ParseInt(s string, base int, bitSize int) (i int64, err error) { if s == "" { return 0, ErrSyntax } // 处理正负号 // 识别进制前缀(0x, 0o, 0b) // 调用 internal 函数 slowerParseInt 或 fasterParseInt }
-
亮点: ✅ 自动识别进制(前缀如
0x
、0o
、0b
) ✅ 支持大整数(按 int64 解析,再用bitSize
检查溢出) ✅ 内部分为 fast/slow 路径,根据输入选择最优解析方式。
🔸 FormatInt
func FormatInt(i int64, base int) string { _, s := formatBits(nil, uint64(i), base, i < 0, false) return s }
-
亮点: ✅ 所有格式化最终走
formatBits
→ 一个核心内部函数 ✅ 用预分配缓冲区,避免多次分配 ✅ 支持任意进制(2-36)
🔸 ParseFloat
func ParseFloat(s string, bitSize int) (float64, error) { // 处理特殊值:NaN、+Inf、-Inf // 解析小数点、指数、符号 // 转换为 IEEE 754 格式 }
-
亮点: ✅ 精确遵循 IEEE 754 浮点规范 ✅ 内部自己实现小数部分解析(不依赖外部库) ✅ 可选 32 位(float32)或 64 位(float64)
🔸 Quote
/ Unquote
func Quote(s string) string { var buf [64]byte b := make([]byte, 0, len(s)+2) // 遍历 s,将特殊字符用转义序列替换 return string(b) }
-
亮点: ✅ 小字符串用栈分配(
[64]byte
) ✅ 精细处理特殊字符(如\n
,\t
,\"
) ✅ 按需转义非 ASCII 字符(QuoteToASCII
)
⚙️ 4️⃣ 性能优化与底层技巧
✅ 位运算优化 很多地方用 >>
, <<
, &
代替除法、取模,提高速度。
✅ 小缓冲区优化 小结果直接用栈上的 [64]byte
,减少堆分配。
✅ 条件分支减少 针对短输入、常见路径有专门分支(例如 ParseInt
对小数值优化)。
✅ 全包内实现 尽量不依赖其他包,避免引入开销或复杂性。
⚠️ 5️⃣ 使用注意事项
1️⃣ 用 strconv.Itoa
而不是 fmt.Sprintf("%d", i)
因为 strconv
比 fmt
快很多。
2️⃣ ParseInt
和 ParseFloat
要正确设置 bitSize
否则可能解析成不需要的精度或溢出。
3️⃣ 对大字符串或大量数据,注意避免频繁转换 比如日志场景,可以用 strings.Builder
或 bytes.Buffer
先拼接好。
4️⃣ Unquote
只能用于带引号的字符串 传入未加引号的会报错。
🌟 总结
分类 | 代表函数 | 特点 |
---|---|---|
整数转换 | Atoi , Itoa , ParseInt , FormatInt | 高效,支持多进制,快速路径优化 |
浮点转换 | ParseFloat , FormatFloat | 遵循 IEEE 754,精准控制小数和指数部分 |
布尔转换 | ParseBool , FormatBool | 简单直接 |
字符串转义 | Quote , Unquote | 精细处理特殊字符和 Unicode |
👉 立即点击链接,开启你的全栈开发之路:Golang全栈开发完整课程