在使用strconv.parselnt时,如果返回值是赋值给一个int变量,那么参数中的bitSize填0的话,会报错。必须把之前的变量声明为确定位数的整型(int8、int16、int32、int64),还要填入对应的数值(int8对应8,int16对应16)。
但是像这样
fmt.Println(strconv.ParseInt(字符串, 10, 0))
直接在另一个函数内调用的却可以填入0,谁能帮忙解释一下。
```
func ParseInt(s string, base int, bitSize int) (i int64, err error)
由于go语言是强类型的特性,所以第一个返回值必须是int64类型,因此你的num也必须是int64类型,
不管你要转换成什么都必须把num声明成int64
但是如果你需要得到其他类型的返回值可以这样干,强制将int64转换成你需要的类型
var tmp int64
tmp, _ = strconv.ParseInt("123", 10, 0)
numInt := int(tmp)
numUint := uint(tmp)
numInt32 := int32(tmp)
fmt.Println(numInt, numUint, numInt32)
第3个参数bitSize实际上做了校验的功能,比如下面的代码会报错
tmp, err := strconv.ParseInt("123456", 10, 8)
fmt.Println(tmp) // 此时tmp = 127
if err != nil {
log.Fatal(err) // strconv.ParseInt: parsing "123456": value out of range
}
那是因为int8范围为[-128~127]
综上所述,当你知道要转换字符串是在某个范围内,那就把bitSize填成对应位即可,
这样转换时也会检查是否越界。
多说一点关于:strconv.ParseUint
这个转换结果必须是uint64,因此只能转换正整数,如果传入字符串为负数那也会报错的。
```
#7
更多评论
`func ParseInt(s string, base int, bitSize int) (i int64, err error)`
你最好贴一下你你的代码,这样好判断。
估计你的错误是这样:
`a:=strconv.ParseInt(字符串,10,0)`
因为ParseInt有两个返回值,你只赋值了一个,所以编译会报错。应该这样:
`a,_:=strconv.ParseInt(字符串,10,0)`
像这样` fmt.Println(strconv.ParseInt(字符串, 10, 0)) `不会报错,是因为你打打印出了两个值,你可以看一下你最后的输出,是不是有两个:
`数值 <nil>`
#1
1楼 <a href="/user/eric160" title="@eric160">@eric160</a> package main
import (
"fmt"
"strconv"
)
func main() {
var str = "2942394"
//var num int
//num, _ = strconv.ParseInt(str, 10, 0)
//fmt.Println(num)
fmt.Println(strconv.ParseInt(str, 10, 0))
}
这是代码。
已经是忽略了error的值了的,可是还是会报错
./hello.go:13:9: cannot assign int64 to num (type int) in multiple assignment
![深度截图_选择区域_20190606173841.png](https://static.studygolang.com/190606/cc38f43c32df2e2d19e8f34efee64de5.png)
#2