strconv.Atoi()字符串转int
strconv.Atoi(tid) 是 Go 语言中用于将 字符串转换为整数(int 类型) 的函数。它的作用是将数字字符串(如 "123")解析为整数(如 123),如果字符串格式无效(如 "abc" 或 ""),则会返回错误。
函数签名
func Atoi(s string) (int, error)
参数 s:要转换的字符串(如 "42")。
返回值:
int:转换成功的整数值。
error:如果转换失败(如非数字字符串),返回错误。
基础用法
成功转换
num, err := strconv.Atoi("123")
if err != nil {
fmt.Println("转换失败:", err)
else {
fmt.Println(num) // 输出: 123(int 类型)
失败转换
_, err := strconv.Atoi("abc")
fmt.Println(err) // 输出: strconv.Atoi: parsing "abc": invalid syntax
在你的代码中的应用
for _, tid := range strings.Split(source.TagIDs, ",") {
if num, err := strconv.Atoi(tid); err == nil {
tagIDs = append(tagIDs, uint(num)) // 将 int 转为 uint 并存储
}
步骤解析:
strings.Split 将 source.TagIDs 按逗号拆分为字符串切片(如 ["1", "2", "3"])。
strconv.Atoi(tid) 尝试将每个字符串元素(如 "1")转为 int(如 1)。
如果转换成功(err == nil),将 int 显式转换为 uint 并追加到 tagIDs 切片。
常见问题
Q1: 为什么不用 strconv.ParseUint 直接得到 uint?
Atoi 返回 int,而 ParseUint 可直接返回 uint,但需要更多参数:
num, err := strconv.ParseUint(tid, 10, 64) // 10 进制,64 位
tagIDs = append(tagIDs, uint(num))
选择依据:
如果后续逻辑需要 int,用 Atoi。
如果明确需要 uint(如数据库无符号 ID),用 ParseUint。
Q2: Atoi 和 ParseInt 有什么区别?
函数 返回值类型 灵活性 示例
Atoi(s) int 简单场景(十进制) Atoi("42") → 42
ParseInt(s, 10, 0) int64 可指定进制和位数 ParseInt("FF", 16, 64) → 255
Atoi 是 ParseInt 的简化版:
func Atoi(s string) (int, error) {
return ParseInt(s, 10, 0) // 10 进制,自动适配 int 位数
Q3: 如何处理前导/后缀空格?
Atoi 不会自动去除空格,需手动调用 strings.TrimSpace:
tid = strings.TrimSpace(tid) // 去除 " 123 " 的空格
num, err := strconv.Atoi(tid)
性能优化
高频调用场景:
Atoi 会解析字符串并检查格式,性能低于直接操作整数。
若对性能敏感,可提前验证数据格式或缓存结果。
替代方案:
如果数据来源可信(如内部接口),可简化错误处理:
num, _ := strconv.Atoi(tid) // 忽略错误(风险自负!)
完整示例
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
source := struct{ TagIDs string }{TagIDs: "1, 42, abc, 3"}
var tagIDs []uint
for _, tid := range strings.Split(source.TagIDs, ",") {
tid = strings.TrimSpace(tid) // 去除空格
if num, err := strconv.Atoi(tid); err == nil {
tagIDs = append(tagIDs, uint(num))
}
fmt.Println(tagIDs) // 输出: [1 42 3]
总结
strconv.Atoi 是字符串→int 的标准方法,适合解析十进制整数。
错误处理必需:始终检查 err,避免无效输入导致程序异常。
扩展需求:如需 uint 或其他进制,改用 ParseUint 或 ParseInt。

浙公网安备 33010602011771号