字符串转换 #
一、strconv包概述 #
strconv包提供字符串与基本类型之间的转换函数。
二、整数转换 #
2.1 整数转字符串 #
go
import "strconv"
s := strconv.Itoa(123)
fmt.Println(s) // "123"
2.2 字符串转整数 #
go
n, err := strconv.Atoi("123")
if err != nil {
fmt.Println("转换失败:", err)
}
fmt.Println(n) // 123
2.3 FormatInt #
指定进制:
go
n := int64(255)
fmt.Println(strconv.FormatInt(n, 10)) // "255"
fmt.Println(strconv.FormatInt(n, 16)) // "ff"
fmt.Println(strconv.FormatInt(n, 2)) // "11111111"
fmt.Println(strconv.FormatInt(n, 8)) // "377"
2.4 ParseInt #
解析指定进制:
go
n, err := strconv.ParseInt("ff", 16, 64)
fmt.Println(n) // 255
n2, err := strconv.ParseInt("11111111", 2, 64)
fmt.Println(n2) // 255
2.5 无符号整数 #
go
n := uint64(255)
s := strconv.FormatUint(n, 16)
fmt.Println(s) // "ff"
n2, _ := strconv.ParseUint("ff", 16, 64)
fmt.Println(n2) // 255
三、浮点数转换 #
3.1 浮点数转字符串 #
go
f := 3.14159
fmt.Println(strconv.FormatFloat(f, 'f', 2, 64)) // "3.14"
fmt.Println(strconv.FormatFloat(f, 'e', 2, 64)) // "3.14e+00"
fmt.Println(strconv.FormatFloat(f, 'g', 2, 64)) // "3.1"
格式说明:
- ‘f’:十进制格式
- ‘e’:科学计数法
- ‘g’:自动选择
3.2 字符串转浮点数 #
go
f, err := strconv.ParseFloat("3.14", 64)
if err != nil {
fmt.Println("转换失败")
}
fmt.Println(f) // 3.14
3.3 使用fmt.Sprintf #
go
f := 3.14159
s := fmt.Sprintf("%.2f", f)
fmt.Println(s) // "3.14"
四、布尔值转换 #
4.1 布尔值转字符串 #
go
s := strconv.FormatBool(true)
fmt.Println(s) // "true"
s2 := strconv.FormatBool(false)
fmt.Println(s2) // "false"
4.2 字符串转布尔值 #
go
b, err := strconv.ParseBool("true")
fmt.Println(b) // true
b2, err := strconv.ParseBool("1")
fmt.Println(b2) // true
b3, err := strconv.ParseBool("false")
fmt.Println(b3) // false
ParseBool接受的值:
- true: “1”, “t”, “T”, “TRUE”, “true”, “True”
- false: “0”, “f”, “F”, “FALSE”, “false”, “False”
五、Quote函数 #
5.1 Quote #
添加双引号并转义:
go
s := strconv.Quote("Hello\nWorld")
fmt.Println(s) // "\"Hello\\nWorld\""
5.2 QuoteToASCII #
转义非ASCII字符:
go
s := strconv.QuoteToASCII("世界")
fmt.Println(s) // "\"\\u4e16\\u754c\""
5.3 QuoteRune #
转义rune:
go
s := strconv.QuoteRune('中')
fmt.Println(s) // "'中'"
5.4 Unquote #
去除引号:
go
s, err := strconv.Unquote(`"Hello\nWorld"`)
fmt.Println(s) // Hello
// World
六、Append函数 #
追加到字节切片:
6.1 AppendInt #
go
buf := []byte("num:")
buf = strconv.AppendInt(buf, 123, 10)
fmt.Println(string(buf)) // num:123
6.2 AppendFloat #
go
buf := []byte("float:")
buf = strconv.AppendFloat(buf, 3.14, 'f', 2, 64)
fmt.Println(string(buf)) // float:3.14
6.3 AppendBool #
go
buf := []byte("bool:")
buf = strconv.AppendBool(buf, true)
fmt.Println(string(buf)) // bool:true
6.4 AppendQuote #
go
buf := []byte("quote:")
buf = strconv.AppendQuote(buf, "Hello")
fmt.Println(string(buf)) // quote:"Hello"
七、实际应用 #
7.1 解析配置 #
go
func parseConfig(s string) (map[string]string, error) {
result := make(map[string]string)
lines := strings.Split(s, "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if line == "" || strings.HasPrefix(line, "#") {
continue
}
parts := strings.SplitN(line, "=", 2)
if len(parts) != 2 {
continue
}
result[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1])
}
return result, nil
}
7.2 解析数字列表 #
go
func parseNumbers(s string) ([]int, error) {
var numbers []int
for _, part := range strings.Split(s, ",") {
n, err := strconv.Atoi(strings.TrimSpace(part))
if err != nil {
return nil, err
}
numbers = append(numbers, n)
}
return numbers, nil
}
7.3 格式化金额 #
go
func formatMoney(amount float64) string {
return fmt.Sprintf("%.2f", amount)
}
func parseMoney(s string) (float64, error) {
return strconv.ParseFloat(s, 64)
}
7.4 进制转换 #
go
func hexToDec(hex string) (int64, error) {
return strconv.ParseInt(hex, 16, 64)
}
func decToHex(n int64) string {
return strconv.FormatInt(n, 16)
}
八、错误处理 #
8.1 NumError #
转换错误类型:
go
n, err := strconv.Atoi("abc")
if err != nil {
if numErr, ok := err.(*strconv.NumError); ok {
fmt.Println("函数:", numErr.Func)
fmt.Println("输入:", numErr.Num)
fmt.Println("错误:", numErr.Err)
}
}
8.2 处理错误 #
go
func safeAtoi(s string) int {
n, err := strconv.Atoi(s)
if err != nil {
return 0
}
return n
}
九、性能优化 #
9.1 使用Append函数 #
go
// 慢
s := strconv.Itoa(123)
buf = append(buf, s...)
// 快
buf = strconv.AppendInt(buf, 123, 10)
9.2 预分配缓冲区 #
go
buf := make([]byte, 0, 100)
buf = strconv.AppendInt(buf, 123, 10)
十、总结 #
strconv包常用函数:
| 分类 | 函数 |
|---|---|
| 整数转换 | Atoi, Itoa, ParseInt, FormatInt |
| 浮点转换 | ParseFloat, FormatFloat |
| 布尔转换 | ParseBool, FormatBool |
| 引号处理 | Quote, Unquote |
| 追加操作 | AppendInt, AppendFloat, AppendBool |
关键点:
- 错误处理:转换函数返回错误
- 进制支持:支持2-36进制
- 精度控制:浮点数可指定精度
- Append函数:高效追加到字节切片
准备好学习正则表达式了吗?让我们进入下一章!
最后更新:2026-03-26