Golang源码分析-strconv

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) stringint → 字符串(十进制)
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️⃣ 核心函数源码分析

我挑几个经典函数细解源码。


🔸 AtoiItoa

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
}
  • 亮点: ✅ 自动识别进制(前缀如 0x0o0b) ✅ 支持大整数(按 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) 因为 strconvfmt 快很多。

2️⃣ ParseIntParseFloat 要正确设置 bitSize 否则可能解析成不需要的精度或溢出。

3️⃣ 对大字符串或大量数据,注意避免频繁转换 比如日志场景,可以用 strings.Builderbytes.Buffer 先拼接好。

4️⃣ Unquote 只能用于带引号的字符串 传入未加引号的会报错。


🌟 总结

分类代表函数特点
整数转换Atoi, Itoa, ParseInt, FormatInt高效,支持多进制,快速路径优化
浮点转换ParseFloat, FormatFloat遵循 IEEE 754,精准控制小数和指数部分
布尔转换ParseBool, FormatBool简单直接
字符串转义Quote, Unquote精细处理特殊字符和 Unicode

👉 立即点击链接,开启你的全栈开发之路:Golang全栈开发完整课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值