Go 语言 strconv 包使用教程
Go 语言的 strconv 包提供了将基本数据类型(如布尔值、整数、浮点数)转换为字符串,以及将字符串解析回这些类型的功能。
1. 基础概念与模块功能
strconv 包的主要功能可以概括为两类:
- Parse 系列: 从字符串中解析出(Parse)基本数据类型的值。这类函数通常返回两个值:解析后的值和一个
error,因此在使用时必须检查错误。 - Format 系列: 将基本数据类型的值格式化(Format)为字符串。
进制 (base) 和位大小 (bitSize)
在进行整数转换时,经常需要指定两个参数:
base(进制): 表示数字的进制,如 2 (二进制)、10 (十进制)、16 (十六进制) 等,范围 2 到 36。如果设为 0,则由字符串前缀决定:0x或0X表示 16 进制,0表示 8 进制,否则为 10 进制。bitSize(位大小): 表示目标类型的大小,如 32 (对应int32) 或 64 (对应int64)。
2. 字符串转基本类型
Parse 系列函数是我们在处理外部输入(如命令行参数、配置文件、JSON 数据)时最常使用的。
字符串转整数
| 函数 | 作用 | 说明 |
|---|---|---|
ParseInt(s, base, bitSize) | 将字符串解析为有符号整数 (int64)。 | 必须指定进制和位大小。 |
ParseUint(s, base, bitSize) | 将字符串解析为无符号整数 (uint64)。 | 必须指定进制和位大小。 |
Atoi(s) | ParseInt(s, 10, 0) 的简化版。 | 仅用于将十进制字符串解析为 int (Go语言中 int 类型的大小),最常用。 |
示例代码:
go
package main
import (
"fmt"
"strconv"
)
func main() {
s1 := "12345"
s2 := "FF" // 十六进制数
// 1. 使用 Atoi:最常见,转十进制 int
i, err := strconv.Atoi(s1)
if err == nil {
fmt.Printf("Atoi 结果: %d (类型: %T)\n", i, i) // 12345 (类型: int)
}
// 2. 使用 ParseInt:指定进制和位大小
// base=10 (十进制), bitSize=64 (结果为 int64)
i64, err := strconv.ParseInt(s1, 10, 64)
if err == nil {
fmt.Printf("ParseInt (10进制) 结果: %d (类型: %T)\n", i64, i64)
}
// 3. 解析十六进制
// base=16 (十六进制), bitSize=8 (结果为 int8)
i8, err := strconv.ParseInt(s2, 16, 8)
if err == nil {
// FF (16进制) 等于 255 (10进制)
fmt.Printf("ParseInt (16进制) 结果: %d (类型: %T)\n", i8, int8(i8)) // 255 (类型: int8)
} else {
// 注意:这里 i8 可能会溢出 int8 的最大值 127,导致错误
// 对于 ParseInt(s2, 16, 8),由于 255 超过 int8 的范围,实际会返回错误
fmt.Println("ParseInt (16进制) 错误:", err) // strconv.ParseInt: value out of range
}
}字符串转浮点数
| 函数 | 作用 | 说明 |
|---|---|---|
ParseFloat(s, bitSize) | 将字符串解析为浮点数 (float64)。 | bitSize 常用 64 (对应 float64) 或 32 (对应 float32)。 |
示例代码:
go
fStr := "3.1415926"
// bitSize=64 (结果为 float64)
f, err := strconv.ParseFloat(fStr, 64)
if err == nil {
fmt.Printf("ParseFloat 结果: %.8f (类型: %T)\n", f, f) // 3.14159260 (类型: float64)
}字符串转布尔值
| 函数 | 作用 | 说明 |
|---|---|---|
ParseBool(s) | 将字符串解析为布尔值 (bool)。 | 只有 "1", "t", "T", "true", "TRUE" 会被解析为 true;只有 "0", "f", "F", "false", "FALSE" 会被解析为 false。其他值都会返回错误。 |
示例代码:
go
bStr1 := "TRUE"
bStr2 := "0"
b1, err1 := strconv.ParseBool(bStr1)
if err1 == nil {
fmt.Printf("ParseBool (\"TRUE\") 结果: %t\n", b1) // true
}
b2, err2 := strconv.ParseBool(bStr2)
if err2 == nil {
fmt.Printf("ParseBool (\"0\") 结果: %t\n", b2) // false
}3. 基本类型转字符串
Format 系列函数用于将 Go 语言的基本数据类型的值转换为字符串表示。
整数转字符串
| 函数 | 作用 | 说明 |
|---|---|---|
FormatInt(i, base) | 将有符号整数 (int64) 格式化为指定进制的字符串。 | 必须指定进制 (base)。 |
FormatUint(i, base) | 将无符号整数 (uint64) 格式化为指定进制的字符串。 | 必须指定进制 (base)。 |
Itoa(i) | FormatInt(int64(i), 10) 的简化版。 | 仅用于将 int 转换为十进制字符串,最常用。 |
示例代码:
go
num := 42
i64 := int64(255)
// 1. 使用 Itoa:转十进制 int 字符串
s := strconv.Itoa(num)
fmt.Printf("Itoa 结果: %s (类型: %T)\n", s, s) // 42 (类型: string)
// 2. 使用 FormatInt:转十六进制字符串
// base=16 (十六进制)
hexS := strconv.FormatInt(i64, 16)
fmt.Printf("FormatInt (16进制) 结果: %s\n", hexS) // ff浮点数转字符串
| 函数 | 作用 | 说明 |
|---|---|---|
FormatFloat(f, fmt, prec, bitSize) | 将浮点数格式化为字符串。 | 最复杂的转换函数,用于精细控制浮点数的输出格式。 |
参数解释:
f: 要转换的浮点数 (float64)。fmt: 格式控制字符,如'f'(小数形式)、'e'(科学计数法)、'g'(根据大小自动选择e或f)。prec: 精度。对于'f','e','E'格式,表示小数点后的位数;对于'g','G'格式,表示总的有效数字位数。-1表示使用最少位数。bitSize: 浮点数类型的大小,如 64 (对应float64) 或 32 (对应float32)。
示例代码:
go
pi := 3.1415926535
// 使用 'f' 格式,保留小数点后 2 位,float64 类型
sFmt := strconv.FormatFloat(pi, 'f', 2, 64)
fmt.Printf("FormatFloat ('f', 2) 结果: %s\n", sFmt) // 3.14
// 使用 'g' 格式,总共保留 6 位有效数字
sGmt := strconv.FormatFloat(pi, 'g', 6, 64)
fmt.Printf("FormatFloat ('g', 6) 结果: %s\n", sGmt) // 3.14159布尔值转布尔值
| 函数 | 作用 | 说明 |
|---|---|---|
FormatBool(b) | 将布尔值 (bool) 转换为字符串。 | true 转换为 "true",false 转换为 "false"。 |
示例代码:
go
b := true
sBool := strconv.FormatBool(b)
fmt.Printf("FormatBool 结果: %s\n", sBool) // true4. 其他常用转换函数
Append 系列
Append 系列函数用于将基本类型值转换为字符串后,追加 (Append) 到现有的字节切片 ([]byte) 后。这在高性能、低内存分配的场景下非常有用。
| 函数 | 作用 |
|---|---|
AppendInt(dst, i, base) | 将 int64 追加到字节切片。 |
AppendFloat(dst, f, fmt, prec, bitSize) | 将 float64 追加到字节切片。 |
AppendBool(dst, b) | 将 bool 追加到字节切片。 |
示例代码:
go
dst := make([]byte, 0, 30) // 创建一个容量为 30 的字节切片
// 追加字符串 "Value: "
dst = append(dst, "Value: "...)
// 追加 int 值 (十进制)
dst = strconv.AppendInt(dst, 456, 10)
// 追加 float 值 (保留两位小数)
dst = append(dst, ", PI: "...)
dst = strconv.AppendFloat(dst, 3.14159, 'f', 2, 64)
fmt.Printf("Append 结果: %s\n", dst) // Value: 456, PI: 3.14Quote 系列
Quote 系列函数用于对字符串进行转义(加引号),常用于生成 Go 语言源代码或 JSON 字符串时,确保特殊字符能正确表示。
| 函数 | 作用 |
|---|---|
Quote(s) | 对字符串进行双引号引用,并对特殊字符进行转义。 |
QuoteToASCII(s) | 类似于 Quote,但会将非 ASCII 字符转换为 \uXXXX 形式。 |
示例代码:
go
str1 := "Hello\nWorld"
quoted1 := strconv.Quote(str1)
fmt.Printf("Quote 结果: %s\n", quoted1) // "Hello\nWorld"
str2 := "你好 Go"
quoted2 := strconv.QuoteToASCII(str2)
fmt.Printf("QuoteToASCII 结果: %s\n", quoted2) // "你好 Go" (Go 1.15+ 会保留中文,旧版本可能转义为 \uXXXX)