在Golang的编程实践中,基础数据类型和字符串之间的转换是非常高频的操作,标准库中的strconv包专门提供了这类转换的配套函数,覆盖了整数、浮点数、布尔值和字符串之间的双向转换需求,不需要开发者自己实现复杂的转换逻辑。

strconv包核心转换函数分类
strconv包的转换函数主要分为两大类,一类是将字符串转换为其他基本类型,另一类是将其他基本类型转换为字符串,下面分别介绍常用函数的使用方式。
字符串转整数
将字符串转为整数的核心函数是Atoi和ParseInt,Atoi是ParseInt的简化版本,适合转换十进制整数。
Atoi的函数签名是func Atoi(s string) (int, error),转换成功返回对应的int类型值,失败返回错误,常见错误是字符串包含非数字字符或者数值超出int类型的范围。
package main
import (
"fmt"
"strconv"
)
func main() {
// 正常转换场景
str1 := "123"
num1, err1 := strconv.Atoi(str1)
if err1 != nil {
fmt.Println("转换失败:", err1)
} else {
fmt.Printf("转换结果: %d, 类型: %Tn", num1, num1)
}
// 转换失败场景,字符串包含字母
str2 := "12a3"
num2, err2 := strconv.Atoi(str2)
if err2 != nil {
fmt.Println("转换失败:", err2)
} else {
fmt.Printf("转换结果: %d, 类型: %Tn", num2, num2)
}
}
如果需要指定转换的进制和返回的整数位数,可以使用ParseInt函数,其签名为func ParseInt(s string, base int, bitSize int) (int64, error),base表示进制,取值范围是0、2到36,bitSize表示结果的整数位数,取值可以是0、8、16、32、64,对应int、int8、int16、int32、int64类型。
package main
import (
"fmt"
"strconv"
)
func main() {
// 转换十六进制字符串为int64
hexStr := "1a"
num, err := strconv.ParseInt(hexStr, 16, 64)
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Printf("转换结果: %dn", num) // 输出26
}
// 转换二进制字符串为int8
binStr := "1010"
num2, err2 := strconv.ParseInt(binStr, 2, 8)
if err2 != nil {
fmt.Println("转换失败:", err2)
} else {
fmt.Printf("转换结果: %d, 类型: %Tn", int8(num2), int8(num2))
}
}
整数转字符串
将整数转为字符串可以使用Itoa函数和FormatInt函数,Itoa是FormatInt的简化版本,默认将int类型转为十进制字符串。
Itoa的函数签名为func Itoa(i int) string,直接返回转换后的字符串,不会返回错误。
package main
import (
"fmt"
"strconv"
)
func main() {
num := 456
str := strconv.Itoa(num)
fmt.Printf("转换结果: %s, 类型: %Tn", str, str)
// 负数转换
num2 := -789
str2 := strconv.Itoa(num2)
fmt.Printf("转换结果: %sn", str2)
}
如果需要指定转换的进制,可以使用FormatInt函数,签名为func FormatInt(i int64, base int) string,base表示进制,取值范围是2到36。
package main
import (
"fmt"
"strconv"
)
func main() {
num := int64(26)
// 转为十六进制字符串
hexStr := strconv.FormatInt(num, 16)
fmt.Println("十六进制结果:", hexStr) // 输出1a
// 转为二进制字符串
binStr := strconv.FormatInt(num, 2)
fmt.Println("二进制结果:", binStr) // 输出11010
}
字符串与浮点数转换
字符串转浮点数使用ParseFloat函数,签名为func ParseFloat(s string, bitSize int) (float64, error),bitSize取值为32或64,对应float32和float64类型,返回的是float64类型,需要手动转为float32。
package main
import (
"fmt"
"strconv"
)
func main() {
floatStr := "3.1415"
f, err := strconv.ParseFloat(floatStr, 64)
if err != nil {
fmt.Println("转换失败:", err)
} else {
fmt.Printf("转换结果: %f, 类型: %Tn", f, f)
// 转为float32
f32 := float32(f)
fmt.Printf("float32结果: %fn", f32)
}
}
浮点数转字符串使用FormatFloat函数,签名为func FormatFloat(f float64, fmt byte, prec, bitSize int) string,fmt表示格式,'f'表示普通小数格式,'e'表示科学计数法,prec表示小数位数,bitSize表示原浮点数的位数,取值32或64。
package main
import (
"fmt"
"strconv"
)
func main() {
f := 3.1415926
// 保留2位小数,普通格式
str := strconv.FormatFloat(f, 'f', 2, 64)
fmt.Println("转换结果:", str) // 输出3.14
// 科学计数法格式
str2 := strconv.FormatFloat(f, 'e', 3, 64)
fmt.Println("科学计数法结果:", str2)
}
字符串与布尔值转换
字符串转布尔值使用ParseBool函数,签名为func ParseBool(str string) (bool, error),可以识别的字符串包括"1"、"t"、"T"、"TRUE"、"true"、"True"、"0"、"f"、"F"、"FALSE"、"false"、"False",其他字符串会返回错误。
package main
import (
"fmt"
"strconv"
)
func main() {
boolStr1 := "true"
b1, err1 := strconv.ParseBool(boolStr1)
if err1 != nil {
fmt.Println("转换失败:", err1)
} else {
fmt.Printf("转换结果: %v, 类型: %Tn", b1, b1)
}
boolStr2 := "1"
b2, err2 := strconv.ParseBool(boolStr2)
if err2 != nil {
fmt.Println("转换失败:", err2)
} else {
fmt.Printf("转换结果: %vn", b2)
}
}
布尔值转字符串使用FormatBool函数,签名为func FormatBool(b bool) string,直接返回"true"或"false"。
package main
import (
"fmt"
"strconv"
)
func main() {
b := true
str := strconv.FormatBool(b)
fmt.Printf("转换结果: %s, 类型: %Tn", str, str)
b2 := false
str2 := strconv.FormatBool(b2)
fmt.Printf("转换结果: %sn", str2)
}
转换过程中的注意事项
- 所有字符串转其他类型的函数都会返回error,实际开发中必须处理错误,不能直接忽略,避免程序因为无效字符串崩溃。
Atoi函数转换的结果是int类型,不同平台下int的位数可能不同,如果需要固定位数的整数,建议使用ParseInt指定bitSize。- 浮点数转字符串时,如果prec设置为-1,会使用最少的位数表示浮点数,避免不必要的小数位。
- 布尔值转换时,只有指定的合法字符串才能转换成功,比如"yes"、"no"这类字符串是无法转换为布尔值的。
常见问题解答
转换失败如何获取具体原因
strconv包的错误类型是NumError,包含转换失败的字符串、错误类型和具体原因,可以通过类型断言获取详细信息。
package main
import (
"fmt"
"strconv"
)
func main() {
str := "12.3"
num, err := strconv.Atoi(str)
if err != nil {
if e, ok := err.(*strconv.NumError); ok {
fmt.Printf("错误类型: %v, 错误字符串: %s, 具体原因: %vn", e.Err, e.Num, e.Err)
}
} else {
fmt.Println(num)
}
}
如何快速判断字符串是否可以转换为整数
可以通过调用转换函数并检查error来判断,也可以自己实现简单的校验逻辑,比如检查字符串是否只包含数字和可选的正负号。
package main
import (
"fmt"
"strconv"
)
func isConvertibleToInt(s string) bool {
_, err := strconv.Atoi(s)
return err == nil
}
func main() {
fmt.Println(isConvertibleToInt("123")) // 输出true
fmt.Println(isConvertibleToInt("12a3")) // 输出false
}
Golangstrconv类型转换string_to_intint_to_string修改时间:2026-07-18 02:48:43