
go语言标准库提供了strconv包,专门用于基本数据类型和字符串之间的转换。其中,atoi函数("ascii to integer"的缩写)是最常用且便捷的字符串转整数函数。
strconv.Atoi函数的签名如下:
func Atoi(s string) (int, error)
它接收一个字符串s作为输入,尝试将其转换为一个int类型的值。如果转换成功,它返回转换后的整数值和一个nil错误;如果转换失败(例如,字符串不是一个合法的整数表示),它将返回一个零值int和一个非nil的错误对象。
以下是使用strconv.Atoi进行字符串到整数转换的基本示例:
package main
import (
"fmt"
"strconv" // 导入strconv包
)
func main() {
// 示例1: 成功转换
str1 := "123"
num1, err1 := strconv.Atoi(str1)
if err1 != nil {
// 转换失败,处理错误
fmt.Printf("字符串 \"%s\" 转换为整数失败: %v\n", str1, err1)
} else {
// 转换成功
fmt.Printf("字符串 \"%s\" 转换为整数: %d, 类型: %T\n", str1, num1, num1)
}
// 示例2: 包含非数字字符的字符串
str2 := "abc"
num2, err2 := strconv.Atoi(str2)
if err2 != nil {
// 转换失败,处理错误
fmt.Printf("字符串 \"%s\" 转换为整数失败: %v\n", str2, err2)
} else {
fmt.Printf("字符串 \"%s\" 转换为整数: %d, 类型: %T\n", str2, num2, num2)
}
// 示例3: 空字符串
str3 := ""
num3, err3 := strconv.Atoi(str3)
if err3 != nil {
fmt.Printf("字符串 \"%s\" 转换为整数失败: %v\n", str3, err3)
} else {
fmt.Printf("字符串 \"%s\" 转换为整数: %d, 类型: %T\n", str3, num3, num3)
}
// 示例4: 超过int范围的数字 (取决于系统int大小)
// 在64位系统上,int通常是64位,所以这个值可能不会溢出。
// 但如果int是32位,这个值就会溢出。
str4 := "9223372036854775807" // int64的最大值
num4, err4 := strconv.Atoi(str4)
if err4 != nil {
fmt.Printf("字符串 \"%s\" 转换为整数失败: %v\n", str4, err4)
} else {
fmt.Printf("字符串 \"%s\" 转换为整数: %d, 类型: %T\n", str4, num4, num4)
}
}运行上述代码,你将看到如下输出(具体错误信息可能略有不同):
立即学习“go语言免费学习笔记(深入)”;
字符串 "123" 转换为整数: 123, 类型: int 字符串 "abc" 转换为整数失败: strconv.Atoi: parsing "abc": invalid syntax 字符串 "" 转换为整数失败: strconv.Atoi: parsing "": invalid syntax 字符串 "9223372036854775807" 转换为整数: 9223372036854775807, 类型: int
从输出可以看出,对于非数字字符串或空字符串,Atoi会返回strconv.NumError类型的错误,其中包含了Err字段,通常是ErrSyntax。对于超出int类型表示范围的数字,Atoi也会返回错误(ErrRange)。
strconv.Atoi是一个方便函数,它实际上是strconv.ParseInt(s, 10, 0)的简写。ParseInt提供了更强大的功能,允许你指定数字的进制(基数)和目标整数的位宽。
strconv.ParseInt函数的签名如下:
func ParseInt(s string, base int, bitSize int) (int64, error)
参数说明:
ParseInt总是返回一个int64类型的值,即使bitSize指定的是较小的位宽。如果转换后的值超出了bitSize所能表示的范围,它会返回一个错误。
以下是使用strconv.ParseInt进行灵活转换的示例:
package main
import (
"fmt"
"strconv"
)
func main() {
// 示例1: 十进制字符串转换为int64
strDec := "42"
numDec, errDec := strconv.ParseInt(strDec, 10, 64) // 10进制,64位
if errDec != nil {
fmt.Printf("十进制字符串 \"%s\" 转换失败: %v\n", strDec, errDec)
} else {
fmt.Printf("十进制字符串 \"%s\" 转换为整数: %d, 类型: %T\n", strDec, numDec, numDec)
}
// 示例2: 十六进制字符串转换为int64
strHex := "FF"
numHex, errHex := strconv.ParseInt(strHex, 16, 64) // 16进制,64位
if errHex != nil {
fmt.Printf("十六进制字符串 \"%s\" 转换失败: %v\n", strHex, errHex)
} else {
fmt.Printf("十六进制字符串 \"%s\" 转换为整数: %d, 类型: %T\n", strHex, numHex, numHex) // FF = 255
}
// 示例3: 二进制字符串转换为int8 (8位)
strBin := "101010" // 42
numBin, errBin := strconv.ParseInt(strBin, 2, 8) // 2进制,8位
if errBin != nil {
fmt.Printf("二进制字符串 \"%s\" 转换为整数失败: %v\n", strBin, errBin)
} else {
fmt.Printf("二进制字符串 \"%s\" 转换为整数: %d, 类型: %T\n", strBin, numBin, numBin)
}
// 示例4: 自动检测进制 (0x前缀为16进制,0前缀为8进制)
strAutoHex := "0x1A" // 十六进制 26
numAutoHex, errAutoHex := strconv.ParseInt(strAutoHex, 0, 64)
if errAutoHex != nil {
fmt.Printf("自动检测十六进制字符串 \"%s\" 转换失败: %v\n", strAutoHex, errAutoHex)
} else {
fmt.Printf("自动检测十六进制字符串 \"%s\" 转换为整数: %d\n", strAutoHex, numAutoHex)
}
strAutoOct := "077" // 八进制 63
numAutoOct, errAutoOct := strconv.ParseInt(strAutoOct, 0, 64)
if errAutoOct != nil {
fmt.Printf("自动检测八进制字符串 \"%s\" 转换失败: %v\n", strAutoOct, errAutoOct)
} else {
fmt.Printf("自动检测八进制字符串 \"%s\" 转换为整数: %d\n", strAutoOct, numAutoOct)
}
// 示例5: 值超出指定bitSize范围
strTooBig := "300"
numTooBig, errTooBig := strconv.ParseInt(strTooBig, 10, 8) // 8位有符号整数范围是 -128 到 127
if errTooBig != nil {
fmt.Printf("字符串 \"%s\" 转换为8位整数失败: %v\n", strTooBig, errTooBig)
} else {
fmt.Printf("字符串 \"%s\" 转换为8位整数: %d\n", strTooBig, numTooBig)
}
}运行上述代码,你将看到如下输出:
十进制字符串 "42" 转换为整数: 42, 类型: int64 十六进制字符串 "FF" 转换为整数: 255, 类型: int64 二进制字符串 "101010" 转换为整数: 42, 类型: int64 自动检测十六进制字符串 "0x1A" 转换为整数: 26 自动检测八进制字符串 "077" 转换为整数: 63 字符串 "300" 转换为8位整数失败: strconv.ParseInt: parsing "300": value out of range
val64, err := strconv.ParseInt("100", 10, 32)
if err != nil {
// ...
}
valInt := int(val64) // 强制转换为int在Go语言中,strconv包提供了强大且灵活的字符串到整数转换功能。strconv.Atoi适用于简单的十进制字符串转换,而strconv.ParseInt则提供了对进制和位宽的精细控制,适用于更复杂的场景。无论选择哪个函数,错误处理都是至关重要的,它能确保程序的健壮性和可靠性。通过理解并正确使用这些函数,开发者可以有效地在Go程序中处理字符串和整数之间的转换。
以上就是Go语言:使用strconv包将字符串安全转换为整数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号