在 Go 语言开发中,字符串与基本数据类型之间的转换非常常见,例如解析 HTTP 参数、读取配置文件、处理 CSV 数据、日志分析以及 CLI 工具开发等。Go 标准库中的
strconv包(string conversion 的缩写)正是为这些场景设计的,它提供了一整套高效、稳定的字符串转换函数,用于在string与int、float、bool等基础类型之间进行转换。由于 Go 是强类型语言,很多数据在读取时都是字符串形式,因此strconv在实际开发中几乎是必不可少的工具库。
首先来看字符串转换为整数的情况。最常见的函数是 strconv.Atoi(),它可以将字符串直接转换为 int 类型,如果转换失败会返回错误。这个函数在解析用户输入、表单数据或 URL 参数时非常常见。
go
package main
import (
"fmt"
"strconv"
)
func main() {
num, err := strconv.Atoi("123")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(num)
}
程序运行后输出 123。需要注意的是,如果字符串包含非数字字符,例如 "12a3",函数就会返回错误,因此在实际开发中通常需要进行错误判断。
如果需要更灵活的控制,例如指定数字进制或整数位数,可以使用 strconv.ParseInt()。该函数允许指定进制(2、8、10、16 等)以及目标整数的位数。函数定义如下:
go
func ParseInt(s string, base int, bitSize int) (int64, error)
例如解析一个十进制整数:
go
num, err := strconv.ParseInt("100", 10, 64)
fmt.Println(num)
输出结果为:
100
ParseInt 的优势在于它不仅可以解析普通十进制数字,还可以处理其他进制的数据。例如解析二进制字符串:
go
num, _ := strconv.ParseInt("1010", 2, 64)
fmt.Println(num)
输出:
10
如果解析十六进制:
go
num, _ := strconv.ParseInt("FF", 16, 64)
fmt.Println(num)
输出:
255
这种功能在处理编码、颜色值、位运算或底层数据协议时非常有用。
除了整数,开发中还经常需要解析浮点数,例如商品价格、统计数据或科学计算等场景。strconv.ParseFloat() 用于将字符串转换为浮点数。
go
price, err := strconv.ParseFloat("19.99", 64)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(price)
输出:
19.99
其中第二个参数 64 表示使用 float64 精度。如果写成 32,则表示解析为 float32。
字符串也可以转换为布尔值,例如配置文件或环境变量中的开关。Go 提供了 strconv.ParseBool() 来处理这种情况。
go
b, err := strconv.ParseBool("true")
fmt.Println(b)
输出:
arduino
true
这个函数支持多种输入形式,例如:
arduino
true
false
1
0
t
f
因此在解析配置文件或环境变量时非常方便。
除了从字符串解析数据,开发中也经常需要把数字转换为字符串。例如在日志输出、URL 拼接或 JSON 构建中。最常见的函数是 strconv.Itoa(),它可以将 int 转换为字符串。
go
num := 123
str := strconv.Itoa(num)
fmt.Println(str)
输出:
123
如果需要控制输出进制,可以使用 strconv.FormatInt()。这个函数允许指定输出进制,例如十进制或十六进制。
go
num := int64(255)
fmt.Println(strconv.FormatInt(num, 10))
fmt.Println(strconv.FormatInt(num, 16))
输出:
255
ff
类似地,浮点数也可以转换为字符串,使用 strconv.FormatFloat()。这个函数提供了更灵活的格式控制,例如小数位数、科学计数法等。
go
price := 19.99
str := strconv.FormatFloat(price, 'f', 2, 64)
fmt.Println(str)
输出:
19.99
其中 'f' 表示普通浮点格式,2 表示保留两位小数。如果使用 'e' 则会输出科学计数法。
布尔值也可以转换为字符串,使用 strconv.FormatBool():
go
b := true
str := strconv.FormatBool(b)
fmt.Println(str)
输出:
arduino
true
strconv 包除了基础转换函数之外,还提供了一些非常实用的字符串处理工具。例如 strconv.Quote() 可以将字符串转为带引号的字符串,并自动处理转义字符。
go
text := "hello\nworld"
fmt.Println(strconv.Quote(text))
输出:
swift
"hello\nworld"
如果需要反向操作,可以使用 strconv.Unquote(),它会去掉字符串外层引号并解析转义字符。
go
str := "\"hello\""
result, _ := strconv.Unquote(str)
fmt.Println(result)
输出:
hello
在高性能程序中,例如 Web 服务器或日志系统,频繁的字符串拼接可能会带来额外的内存分配开销。为了解决这个问题,strconv 提供了 Append 系列函数,例如 AppendInt、AppendFloat 和 AppendBool。这些函数可以直接把数据追加到字节切片中,从而减少内存分配次数。
go
buf := []byte("number:")
buf = strconv.AppendInt(buf, 100, 10)
fmt.Println(string(buf))
输出:
makefile
number:100
这种方式在高并发程序中可以显著提升性能。
在实际项目中,strconv 常见的应用场景包括:解析 HTTP 请求参数,例如把字符串形式的页码转换为整数;处理配置文件,将字符串转换为布尔值或数字;处理 CSV 或文本数据,将读取的字符串转为数值类型;生成日志或构建字符串 ID,例如把用户 ID 和订单 ID 转换为字符串再拼接输出。
总体来看,strconv 是 Go 标准库中非常核心的一部分,它负责完成字符串与基础数据类型之间的安全转换。常用函数包括 Atoi、Itoa、ParseInt、FormatInt、ParseFloat、FormatFloat、ParseBool、FormatBool 等,而在高性能场景下还可以使用 AppendInt、AppendFloat 等函数来减少内存分配。熟练掌握 strconv,不仅能够提高代码的可读性,也能够让程序在数据解析与格式转换方面更加高效稳定。在 Web 服务、CLI 工具、数据处理程序以及日志系统中,这个包几乎是每个 Go 开发者都会频繁使用的重要工具库。