String Conversion,字符串转换
strconv 是 Go 语言标准库中的一个「包」,提供了将字符串与基本数据类型(如整数、浮点数、布尔值)之间相互转换的功能。
atoi.go
:包含从 ASCII 字符串到整数(Integer)的转换函数。atof.go
:包含从 ASCII 字符串到浮点数(Float)的转换函数。itoa.go
:包含从整数(Integer)到 ASCII 字符串的转换函数。ftoa.go
:包含从浮点数(Float)到 ASCII 字符串的转换函数。atob.go
:包含从 ASCII 字符串到布尔值(Boolean)的转换函数。atoc.go
:包含从 ASCII 字符串到字符(Character)的转换函数。- …
一、常用系列
-
Atoi
和Itoa
:用于将整数(10进制)与字符串之间进行转换。“askii to int” 「and」 “int to askii”,该函数较为常用,故“封装”了出来。
Atoi
(字符串到整数):func Atoi(s string) (int, error)
。此函数将字符串形式的整数转换为int
类型。如果字符串无法表示为整数,则会返回错误,这是一个简化的 ParseInt 函数,用来表示特定的十进制场景。Itoa
(整数到字符串):func Itoa(i int) string
。此函数将int
类型的整数转换为字符串形式。此函数将int
类型的整数转换为十进制字符串表示,这是一个简化的 FormatInt 函数,主要用于处理十进制整数。
// 源码 // Itoa is equivalent to FormatInt(int64(i), 10). func Itoa(i int) string { return FormatInt(int64(i), 10) }
二、Parse/Format系列
-
ParseInt
和FormatInt
:用于将字符串与带符号整数(只允许2-36进制)之间进行转换。-
ParseInt
:func ParseInt(s string, base int, bitSize int) (i int64, err error)
。此函数将字符串形式的整数转换为指定进制(如 10 进制、16 进制)和位大小(如 32 位、64 位)的int64
类型。如果字符串无法表示为整数或超出指定位大小的范围,则会返回错误。 -
FormatInt
:func FormatInt(i int64, base int) string
。此函数将int64
类型的整数转换为指定进制的字符串形式。
-
-
ParseUint
和FormatUint
:用于将字符串与无符号整数之间进行转换。-
ParseUint
:func ParseUint(s string, base int, bitSize int) (uint64, error)
。此函数与ParseInt
类似,但用于处理无符号整数。 -
FormatUint
:func FormatUint(i uint64, base int) string
。此函数与FormatInt
类似,但用于处理无符号整数。
-
-
ParseFloat
和FormatFloat
:用于将字符串与浮点数之间进行转换。-
ParseFloat
:func ParseFloat(s string, bitSize int) (float64, error)
。此函数将字符串形式的浮点数转换为指定位大小(32 位或 64 位)的float64
类型。如果字符串无法表示为浮点数,则会返回错误。 -
FormatFloat
:func FormatFloat(f float64, fmt byte, prec int, bitSize int) string
。此函数将float64
类型的浮点数转换为字符串形式。可以指定格式(如 ‘f’、‘e’、‘g’)、精度和位大小。
-
-
ParseBool
和FormatBool
:用于将字符串与布尔值之间进行转换。-
ParseBool
:func ParseBool(str string) (bool, error)
。此函数将字符串形式的布尔值(如 “true” 或 “false”)转换为bool
类型。如果字符串无法表示为布尔值,则会返回错误。 -
FormatBool
:func FormatBool(b bool) string
。此函数将bool
类型的布尔值转换为字符串形式(“true” 或 “false”)。
-
三、Append系列
append 系列的主要作用是将其他类型的值,追加到字符串切片(如 []byte),最终生成新的字符串切片。
-
AppendInt
:用于将带符号整数转换为字符串并追加到一个字节切片中。dst := []byte("int64:") dst = strconv.AppendInt(dst, int64(123), 10) fmt.Println(string(dst)) // 输出 "int64:123"
如果不采用这种方式,则需要先将 123 转为 string 类型,而后使用 append 添加到 dst 切片
如果采用了这种方式,则一行解决
-
AppendUint
:用于将无符号整数转换为字符串并追加到一个字节切片中。 -
AppendFloat
:用于将浮点数转换为字符串并追加到一个字节切片中。dst := []byte("float64:") dst = strconv.AppendFloat(dst, 3.1415, 'f', 2, 64) fmt.Println(string(dst)) // 输出 "float64:3.14"
-
AppendBool
:用于将布尔值转换为字符串并追加到一个字节切片中。dst := []byte("bool:") dst = strconv.AppendBool(dst, true) fmt.Println(string(dst)) // 输出 "bool:true"
-
AppendQuote
:用于将带引号的字符串转换并追加到一个字节切片中。dst := []byte("quote:") dst = strconv.AppendQuote(dst, "example") fmt.Println(string(dst)) // 输出 "quote:\"example\""
通过这些 Append
系列的函数,可以在不产生额外的字符串分配的情况下,直接在字节切片上进行各种类型的转换和追加操作,这在性能敏感的应用中是非常有用的。
四、其他
Quote
和 Unquote
:用于处理字符串引用和反引用。
- Quote:
func Quote(s string) string
。此函数将输入字符串用双引号括起来,并转义其中的特殊字符(如换行符、制表符等),将普通字符串转换为带引号的 Go 语言字符串。 - Unquote:
func Unquote(s string) (string, error)
。此函数将带引号的 Go 语言字符串转换为普通字符串,移除输入字符串的引号并解析其中的转义字符。
五、错误处理
返回值的第二个参数为 error
value, err := strconv.Atoi("abc")
if err != nil {
fmt.Println("转换失败:", err)
}
当转换发生错误时:
-
如果不接收错误,则 panic
-
接收错误但不处理,程序表现可能不符合预期,因为此时
value
固定为空值,如 0
六、使用场景
- 配置文件解析:当从配置文件(如 JSON、YAML、INI 等)中读取值时,通常需要将字符串转换为特定类型。
strconv
包提供了一种高效且类型安全的方式来完成这些转换。 - 网络协议解析:在处理如 HTTP、FTP 等网络协议时,经常需要将字符串和数字、布尔值等进行转换。
strconv
包能够高效地完成这些任务。 - 数据库操作:当从数据库中读取或写入数据时,可能需要进行类型转换。例如,从数据库中读取一个整数字段,但数据库驱动返回了一个字符串。
- 日志记录:在生成日志时,经常需要将各种数据类型转换为字符串形式以便记录。
strconv
包的Format*
系列函数非常适用于这种场景。 - 用户输入验证:当需要从用户输入或外部源获取数据并转换为特定类型时,
strconv
包的Parse*
系列函数可以帮助验证和转换这些数据。 - 性能优化:在性能敏感的应用中,避免不必要的内存分配是很重要的。
strconv
的Append*
系列函数可以在一个已存在的字节切片上进行操作,避免了额外的内存分配。