引入
Go strings 包 处理字符串的文本操作,但程序里经常要在字符串和数字之间转换——从配置文件读到的端口号是 "8080",要变成 int 才能用;日志里要把数字变成字符串写进去。strconv 包就是专门做字符串和基本类型之间转换的标准库。
正文
定义
定义
strconv包提供字符串与基本类型之间的转换函数。核心功能是把字符串解析为数字(Atoi、ParseInt、ParseFloat),以及把数字格式化为字符串(Itoa、FormatInt、FormatFloat)。转换失败时返回error。
语法
import "strconv"
// 字符串 → 数字
n, err := strconv.Atoi("42") // 42, nil
f, err := strconv.ParseFloat("3.14", 64) // 3.14, nil
// 数字 → 字符串
s := strconv.Itoa(42) // "42"
s = strconv.FormatFloat(3.14, 'f', 2, 64) // "3.14"例子
Atoi 和 Itoa
// Atoi: ASCII to Integer,字符串转 int
n, err := strconv.Atoi("42")
fmt.Println(n, err) // 42 <nil>
n, err = strconv.Atoi("abc")
fmt.Println(n, err) // 0 strconv.Atoi: parsing "abc": invalid syntax
// Itoa: Integer to ASCII,int 转字符串
s := strconv.Itoa(42)
fmt.Println(s) // "42"
s = strconv.Itoa(-100)
fmt.Println(s) // "-100"Atoi 和 Itoa 是最常用的两个函数,专门处理 int 和字符串之间的互转。转换失败返回 error,记得检查。
ParseInt
// ParseInt(s, base, bitSize)
n, err := strconv.ParseInt("42", 10, 64) // 十进制,64 位
fmt.Println(n, err) // 42 <nil>
n, err = strconv.ParseInt("ff", 16, 64) // 十六进制
fmt.Println(n, err) // 255 <nil>
n, err = strconv.ParseInt("1010", 2, 64) // 二进制
fmt.Println(n, err) // 10 <nil>ParseInt 比 Atoi 更灵活,可以指定进制(base)和位数(bitSize)。Atoi 本质上等价于 ParseInt(s, 10, 0)。
ParseFloat
f, err := strconv.ParseFloat("3.14", 64)
fmt.Println(f, err) // 3.14 <nil>
f, err = strconv.ParseFloat("1.5e10", 64)
fmt.Println(f, err) // 1.5e+10 <nil>
f, err = strconv.ParseFloat("abc", 64)
fmt.Println(f, err) // 0 strconv.ParseFloat: parsing "abc": invalid syntax第二个参数是精度,64 表示 float64,32 表示 float32。支持科学计数法格式。
FormatInt 和 FormatFloat
// FormatInt: int64 转指定进制的字符串
s := strconv.FormatInt(255, 16) // "ff"(十六进制)
s = strconv.FormatInt(10, 2) // "1010"(二进制)
// FormatFloat: float 转字符串
s = strconv.FormatFloat(3.1415, 'f', 2, 64) // "3.14"(定点,2 位小数)
s = strconv.FormatFloat(3.1415, 'e', 2, 64) // "3.14e+00"(科学计数法)
s = strconv.FormatFloat(3.1415, 'g', -1, 64) // "3.1415"(自动选择格式)FormatFloat 的参数比较多:fmt 控制格式(f 定点、e 科学计数、g 自动),prec 控制精度(-1 表示最少位数),bitSize 控制精度类型。
ParseBool 和 FormatBool
b, err := strconv.ParseBool("true")
fmt.Println(b, err) // true <nil>
b, err = strconv.ParseBool("1")
fmt.Println(b, err) // true <nil>
s := strconv.FormatBool(false)
fmt.Println(s) // "false"ParseBool 接受 "1"、"t"、"T"、"TRUE"、"true"、"True"、"0"、"f"、"F"、"FALSE"、"false"、"False" 这些值。
实际场景
import (
"fmt"
"strconv"
"strings"
)
// 解析 "key=value" 格式的配置
config := "port=8080"
parts := strings.SplitN(config, "=", 2)
key := parts[0]
port, err := strconv.Atoi(parts[1])
if err != nil {
fmt.Println("端口号格式错误:", err)
return
}
fmt.Printf("%s = %d (类型: %T)\n", key, port, port)
// port = 8080 (类型: int)实际开发中,strings 和 strconv 经常配合使用:先用字符串函数拆分,再用 strconv 转换类型。
常见写法
| 函数 | 说明 |
|---|---|
strconv.Atoi(s) | 字符串转 int |
strconv.Itoa(i) | int 转字符串 |
strconv.ParseInt(s, base, bitSize) | 字符串转 int64,可指定进制 |
strconv.ParseFloat(s, bitSize) | 字符串转 float64 |
strconv.ParseBool(s) | 字符串转 bool |
strconv.FormatInt(i, base) | int64 转指定进制的字符串 |
strconv.FormatFloat(f, fmt, prec, bitSize) | float64 转字符串 |
strconv.FormatBool(b) | bool 转字符串 |
特点
Atoi/Itoa是最常用的一对,专门处理int和字符串互转Parse系列函数都会返回error,转换失败必须检查ParseInt比Atoi灵活,支持不同进制和位数ParseFloat的第二个参数是精度(32或64),不是小数位数Format系列函数用于数字转字符串,支持进制和格式控制Atoi等价于ParseInt(s, 10, 0)再转int- 和 Go strings 包 配合使用是处理文本数据的标准套路
理解
strconv 包做的事很单纯:字符串和数字互相转换。日常记住 Atoi / Itoa 就够用了,遇到需要指定进制或精度的场景再上 ParseInt / ParseFloat。所有 Parse 函数都可能失败,别忘了检查 error。这个包虽然小,但在解析配置、处理用户输入、格式化输出时几乎必定用到。
引出
字符串转数字经常出现在读取环境变量的场景——环境变量都是字符串,但程序需要的是数字类型。接下来看 Go os 包,学习怎么用 os 包操作环境变量、文件和命令行参数。