使用strconv.ParseInt并检查error可安全转换字符串为整数,示例中对合法数字、非数字、浮点数字符串及超范围值均进行了错误处理,确保程序健壮性。

在Go语言的日常开发中,
strconv
strconv
strconv
Parse
Format
将字符串转换为数字:
strconv.Atoi(s string) (int, error)
int
ParseInt(s, 10, 0)
strconv.ParseInt(s string, base int, bitSize int) (int64, error)
base
bitSize
int
int8
int16
int32
int64
strconv.ParseUint(s string, base int, bitSize int) (uint64, error)
ParseInt
strconv.ParseFloat(s string, bitSize int) (float64, error)
bitSize
float32
float64
strconv.ParseBool(s string) (bool, error)
true
false
将数字转换为字符串:
立即学习“go语言免费学习笔记(深入)”;
strconv.Itoa(i int) string
int
strconv.FormatInt(i int64, base int) string
int64
strconv.FormatUint(i uint64, base int) string
uint64
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
fmt
prec
bitSize
strconv.FormatBool(b bool) string
所有
Parse
error
在Go语言中,将字符串转换为整数时,最关键的一点就是“安全”,这意味着我们不能简单地假设输入总是合法的数字。比如,用户可能输入了“abc”或者“123.45”,这些都不是有效的整数。因此,错误处理是必不可少的环节。
通常我会使用
strconv.ParseInt
strconv.Atoi
Atoi
ParseInt
package main
import (
"fmt"
"strconv"
)
func main() {
strNum := "12345"
strInvalid := "hello"
strFloat := "123.45"
strLarge := "9223372036854775808" // 超过int64最大值
// 示例1: 正常转换
if num, err := strconv.ParseInt(strNum, 10, 64); err != nil {
fmt.Printf("转换 '%s' 失败: %v\n", strNum, err)
} else {
fmt.Printf("'%s' 转换为 int64: %d\n", strNum, num)
}
// 示例2: 转换非数字字符串
if num, err := strconv.ParseInt(strInvalid, 10, 64); err != nil {
fmt.Printf("转换 '%s' 失败: %v\n", strInvalid, err)
// 这里err通常是 *strconv.NumError 类型,可以通过类型断言获取更多信息
if numErr, ok := err.(*strconv.NumError); ok {
fmt.Printf(" 错误类型: %v, 值: '%s'\n", numErr.Err, numErr.Num)
}
} else {
fmt.Printf("'%s' 转换为 int64: %d\n", strInvalid, num)
}
// 示例3: 转换浮点数字符串(ParseInt会失败)
if num, err := strconv.ParseInt(strFloat, 10, 64); err != nil {
fmt.Printf("转换 '%s' 失败: %v\n", strFloat, err)
} else {
fmt.Printf("'%s' 转换为 int64: %d\n", strFloat, num)
}
// 示例4: 转换超出范围的数字
if num, err := strconv.ParseInt(strLarge, 10, 64); err != nil {
fmt.Printf("转换 '%s' 失败: %v\n", strLarge, err)
if numErr, ok := err.(*strconv.NumError); ok {
fmt.Printf(" 错误类型: %v, 值: '%s'\n", numErr.Err, numErr.Num)
}
} else {
fmt.Printf("'%s' 转换为 int64: %d\n", strLarge, num)
}
// 使用Atoi的简单场景
if i, err := strconv.Atoi("100"); err == nil {
fmt.Printf("Atoi 转换 '100': %d\n", i)
}
}在上面的例子中,我们看到
ParseInt
nil
error
error
*strconv.NumError
ErrSyntax
ErrRange
strconv
strconv
FormatInt
FormatUint
FormatFloat
例如,
FormatInt(i int64, base int)
int64
base
package main
import (
"fmt"
"strconv"
)
func main() {
var num int64 = 255
var uNum uint64 = 65535
// 格式化为二进制
binStr := strconv.FormatInt(num, 2)
fmt.Printf("%d (十进制) 转换为二进制: %s\n", num, binStr) // 输出: 255 (十进制) 转换为二进制: 11111111
// 格式化为八进制
octStr := strconv.FormatInt(num, 8)
fmt.Printf("%d (十进制) 转换为八进制: %s\n", num, octStr) // 输出: 255 (十进制) 转换为八进制: 377
// 格式化为十六进制
hexStr := strconv.FormatInt(num, 16)
fmt.Printf("%d (十进制) 转换为十六进制: %s\n", num, hexStr) // 输出: 255 (十进制) 转换为十六进制: ff
// 无符号整数的格式化
uHexStr := strconv.FormatUint(uNum, 16)
fmt.Printf("%d (无符号十进制) 转换为十六进制: %s\n", uNum, uHexStr) // 输出: 65535 (无符号十进制) 转换为十六进制: ffff
}对于浮点数,
strconv.FormatFloat
f float64
fmt byte
prec int
bitSize int
package main
import (
"fmt"
"strconv"
)
func main() {
var pi float64 = 3.1415926535
// 'f' 格式,小数点后两位
fmt.Printf("f 格式, 精度2: %s\n", strconv.FormatFloat(pi, 'f', 2, 64)) // 输出: 3.14
// 'e' 格式,科学计数法,小数点后四位
fmt.Printf("e 格式, 精度4: %s\n", strconv.FormatFloat(pi, 'e', 4, 64)) // 输出: 3.1416e+00
// 'g' 格式,总有效数字五位
fmt.Printf("g 格式, 精度5: %s\n", strconv.FormatFloat(pi, 'g', 5, 64)) // 输出: 3.1416
// 'g' 格式,自动选择精度(-1)
fmt.Printf("g 格式, 自动精度: %s\n", strconv.FormatFloat(pi, 'g', -1, 64)) // 输出: 3.1415926535
// 较大的数字,'g' 格式可能会自动切换到科学计数法
largeNum := 123456789.12345
fmt.Printf("大数字 g 格式, 精度5: %s\n", strconv.FormatFloat(largeNum, 'g', 5, 64)) // 输出: 1.2346e+08
}这些高级格式化选项赋予了我们极大的灵活性,可以根据不同的业务需求,将数字以最适合的方式呈现出来。在我看来,这种细粒度的控制,正是
strconv
strconv
浮点数的转换,尤其是从字符串解析到浮点数,或者将浮点数格式化为字符串,常常伴随着精度问题。这并非
strconv
float32
float64
在
strconv.ParseFloat
float64
bitSize
ParseFloat
bitSize
strconv
float32
float64
float64
float32
package main
import (
"fmt"
"strconv"
)
func main() {
s := "0.1"
f64, _ := strconv.ParseFloat(s, 64)
f32, _ := strconv.ParseFloat(s, 32)
fmt.Printf("字符串 '%s' 解析为 float64: %.17f\n", s, f64) // 可能会输出 0.10000000000000001
fmt.Printf("字符串 '%s' 解析为 float32: %.17f\n", s, f32) // 可能会输出 0.10000000149011612
// 比较两个浮点数
fmt.Println("0.1 == f64:", 0.1 == f64) // 结果可能是 false,因为0.1在Go中也是近似值
}在
strconv.FormatFloat
fmt
prec
'f'
prec
'g'
'g'
prec
strconv
fmt
prec
最佳实践:
float32
float64
shopspring/decimal
ParseFloat
==
0.1 + 0.2 == 0.3
false
float64
对我个人而言,处理浮点数转换时,我总是保持一种警惕。尤其是在涉及金钱或科学测量等领域,我宁愿多花一些时间去理解和处理这些精度问题,而不是让它们在未来的某个时刻悄无声息地引发bug。
strconv
以上就是Golang strconv库字符串与数字转换实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号