Golang将字符串转换为特定类型的int(int8,int16,int32,int64)

时间:2015-05-18 09:35:20

标签: go

我试图在go-lang中将字符串解析为整数。我在文档中发现的问题是它提到的语法如下:

ParseInt(s string, base int, bitSize int)

其中,s是要解析的字符串,字符串的前缀隐含base:“0x”表示基数16,“0”表示基数8,否则表示基数10。

bitSize 参数是我遇到问题的地方。根据{{​​3}}的文档,它指定结果必须适合的整数类型。位大小0,8,16,32和64对应于int,int8,int16,int32和int64。

但对于所有的值,如0,8,16,32& 64.我得到相同类型的返回值。即int64类型。

有人能指出我错过了什么。

代码:ParseInt

5 个答案:

答案 0 :(得分:20)

根据documentation

  

func ParseInt(s string,base int,bitSize int)(i int64,err error)

无论如何,ParseInt始终返回int64。此外

  

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

所以基本上你的bitSize参数只告诉你要解析的字符串值在解析后应该适合bitSize。如果没有,超出范围将会发生。

就像在这个 PlayGround strconv.ParseInt("192", 10, 8)中一样(因为你看到解析后的值会大于int8的最大值)。

如果您想将其解析为您需要的任何值,请稍后使用int8(i)int8int16int32)。

P.S。因为您触及了如何转换为特定intX的主题,我会概述它也可以转换为unsigned int

答案 1 :(得分:15)

ParseInt始终返回int64,您需要将结果转换为所需类型。当您将32作为第三个参数传递时,如果解析的值不适合int32,则会得到解析错误,但返回的类型始终为int64。< / p>

例如:

i, err := strconv.ParseInt("9207", 10, 32)
if err != nil {
    panic(err)
}
result := int32(i)
fmt.Printf("Parsed int is %d\n", result)

答案 2 :(得分:0)

您提到的函数的源代码如下:

func ParseInt(s string, base int, bitSize int) (i int64, err error)

因此它将始终返回int64

请注意,如果要将int32转换为int64,只需使用int64(),就不会有任何问题。

但是将int64转换为int32是不安全的。如果您要转换的数字大于int32的最大值,则结果值将是错误的。因此,不建议使用int32()int64转换为int32

答案 3 :(得分:-1)

关于从stringint的转换,我做了一次测试, 我推荐方式2({strconv.Atoi("1339882")):

func BenchmarkGetN(b *testing.B)  {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        i, err := strconv.ParseInt("1339882", 10, 32)
        if err != nil {
            panic(err)
        }
        a := int32(i)
        _ = a
    }
}

func BenchmarkGetN2(b *testing.B) {
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        a, _ := strconv.Atoi("1339882")
        bc := int32(a)
        _ = bc
    }
}
goos: darwin
goarch: amd64
pkg: phonedata
BenchmarkGetN-4         100000000               20.0 ns/op
BenchmarkGetN2-4        200000000                9.25 ns/op
PASS
ok      phonedata       10.913s

答案 4 :(得分:-1)

您可以使用Sscan

package main
import "fmt"

func main() {
   {
      var n int8
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
   {
      var n int16
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
   {
      var n int32
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
   {
      var n int64
      fmt.Sscan("100", &n)
      fmt.Println(n == 100)
   }
}

https://golang.org/pkg/fmt#Sscan