我试图在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
答案 0 :(得分:20)
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)
(int8
,int16
,int32
)。
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)
关于从string
到int
的转换,我做了一次测试,
我推荐方式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)
}
}