Skip to content

Go 语言 strconv 包使用教程

Go 语言的 strconv 包提供了将基本数据类型(如布尔值、整数、浮点数)转换为字符串,以及将字符串解析回这些类型的功能。

1. 基础概念与模块功能

strconv 包的主要功能可以概括为两类:

  1. Parse 系列: 从字符串中解析出(Parse)基本数据类型的值。这类函数通常返回两个值:解析后的值和一个 error,因此在使用时必须检查错误。
  2. Format 系列: 将基本数据类型的值格式化(Format)为字符串。

进制 (base) 和位大小 (bitSize)

在进行整数转换时,经常需要指定两个参数:

  • base(进制): 表示数字的进制,如 2 (二进制)、10 (十进制)、16 (十六进制) 等,范围 2 到 36。如果设为 0,则由字符串前缀决定:0x0X 表示 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' (根据大小自动选择 ef)。
  • 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) // true

4. 其他常用转换函数

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.14

Quote 系列

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)