字符串转换 #

一、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

关键点:

  1. 错误处理:转换函数返回错误
  2. 进制支持:支持2-36进制
  3. 精度控制:浮点数可指定精度
  4. Append函数:高效追加到字节切片

准备好学习正则表达式了吗?让我们进入下一章!

最后更新:2026-03-26