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。

posted @ 2025-07-09 22:37  GoldPuzzle  阅读(55)  评论(0)    收藏  举报