引入

Go strings 包 处理字符串的文本操作,但程序里经常要在字符串和数字之间转换——从配置文件读到的端口号是 "8080",要变成 int 才能用;日志里要把数字变成字符串写进去。strconv 包就是专门做字符串和基本类型之间转换的标准库。

正文

定义

定义

strconv 包提供字符串与基本类型之间的转换函数。核心功能是把字符串解析为数字(AtoiParseIntParseFloat),以及把数字格式化为字符串(ItoaFormatIntFormatFloat)。转换失败时返回 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"

AtoiItoa 是最常用的两个函数,专门处理 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>

ParseIntAtoi 更灵活,可以指定进制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 表示 float6432 表示 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)

实际开发中,stringsstrconv 经常配合使用:先用字符串函数拆分,再用 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转换失败必须检查
  • ParseIntAtoi 灵活,支持不同进制和位数
  • ParseFloat 的第二个参数是精度(3264),不是小数位数
  • Format 系列函数用于数字转字符串,支持进制和格式控制
  • Atoi 等价于 ParseInt(s, 10, 0) 再转 int
  • Go strings 包 配合使用是处理文本数据的标准套路

理解

strconv 包做的事很单纯:字符串和数字互相转换。日常记住 Atoi / Itoa 就够用了,遇到需要指定进制或精度的场景再上 ParseInt / ParseFloat。所有 Parse 函数都可能失败,别忘了检查 error。这个包虽然小,但在解析配置、处理用户输入、格式化输出时几乎必定用到。

引出

字符串转数字经常出现在读取环境变量的场景——环境变量都是字符串,但程序需要的是数字类型。接下来看 Go os 包,学习怎么用 os 包操作环境变量、文件和命令行参数。