Golang中使用ParseInt()/Atoi()将字符串转换为int类型的方法

Golang中使用ParseInt()/Atoi()将字符串转换为int类型的方法 大家好!

关于使用 strconv 包进行 stringint 转换的问题。

首先,strconv.Atoi() 返回的是 int 类型。 其次,看起来 strconv.ParseInt() 从不返回 int 类型。然而,语言定义中说:

“bitSize 参数指定结果必须适合的整数类型。位大小 0、8、16、32 和 64 分别对应 int、int8、int16、int32 和 int64。”

那么,如果我这样做:

n, _ := strconv.ParseInt("42", 10, 0)

n 应该是一个 int,而不是 int64。对吗?但是,它是 int64

有什么想法吗?

谢谢。


更多关于Golang中使用ParseInt()/Atoi()将字符串转换为int类型的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

也许我需要把这个发到语言定义论坛。这些不符合规范。位数为0应该返回一个"int",无论是32位还是64位取决于机器,但它应该是一个"int"。

更多关于Golang中使用ParseInt()/Atoi()将字符串转换为int类型的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


bitSize 参数指定了结果必须适配的整数类型

并不意味着实际使用了该类型。

也许可以尝试在 32 位系统上运行以下代码,看看会发生什么。

func main() {
    fmt.Println("hello world")
}

哇 😄 对于一个12分钟前就已经被回答的问题,这真是一个非常长的答案;

请参阅 strconv.ParseInt() 从不返回 int

#KeepItSimple

首先,非常感谢您的回复。

不过,在文档的引文中(重复如下):

bitSize 参数指定结果必须适配的整数类型。位大小 0、8、16、32 和 64 分别对应 int、int8、int16、int32 和 int64。”

第二句话暗示 bitsize0 时对应 int

我哪里理解错了?谢谢。

bitSize 参数指定了结果必须适配的整数类型。

这意味着 int64 类型的结果可以安全地转换到你的整数类型:

i64, _ := strconv.ParseInt("42", 10, 64)

或者

i64, _ := strconv.ParseInt("42", 10, 32)
var i32 int32 = i64 // 转换为 int32

或者

i64, _ := strconv.ParseInt("42", 10, 0)
var i int = i64 // 转换为 int

int 类型根据你的系统可能是 int32int64。通过将 bitSize 设置为 0,你让 ParseInt 为你选择合适的类型(32位或64位)。

strconv.ParseInt() 函数确实总是返回 int64 类型,无论你指定的 bitSize 参数是多少。bitSize 参数的作用是限制解析的数值范围,使其不超过指定整数类型的范围,但返回值类型始终是 int64

文档中提到的“对应”是指数值范围的对应,而不是返回类型的对应。函数内部会将解析后的值转换为 int64,但会根据 bitSize 进行范围检查。

如果你需要得到 int 类型,你有两个选择:

  1. 使用 strconv.Atoi() - 这是最直接的方法,它内部调用 ParseInt 并转换为 int
n, err := strconv.Atoi("42")
// n 的类型是 int
  1. 使用 ParseInt() 并显式转换
n64, err := strconv.ParseInt("42", 10, 0)
n := int(n64)  // 显式转换为 int

bitSize 参数的实际作用示例:

// 这些都会返回 int64,但会进行不同的范围检查
n1, _ := strconv.ParseInt("127", 10, 8)   // 必须适合 int8 范围
n2, _ := strconv.ParseInt("32767", 10, 16) // 必须适合 int16 范围
n3, _ := strconv.ParseInt("42", 10, 0)    // 必须适合 int 范围(当前平台)

所以你的观察是正确的:ParseInt("42", 10, 0) 返回的是 int64 类型,而不是 int。如果你需要 int 类型,应该使用 Atoi() 或者进行显式类型转换。

回到顶部