本系列文章由刀码旦编写,转载请注明出处
func ParseInt(s string, base int, bitSize int) (i int64, err error)
参数概述
返回字符串表示的整数值,接受正负号。
base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制;
bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。
起初我的理解,以为bitSize参数指定的是需要返回的int类型,比如int8 、int16、int32、int64。你指定什么就返回什么类型的int,只要不溢出。
但是通过代码实践却发现不是这么回事
var str1 string = "12"
var n1 int8
n1 ,_ = strconv.ParseInt(str1,10,8)
会有错误提示
Cannot assign int64 to n1 (type int8) in multiple assignment
同理你指定其他类型也同样报错。
只有你指定n1 为int64才正确
var str1 string = "1234"
var n1 int64
n1 ,_ = strconv.ParseInt(str1,10,8)
fmt.Printf("n1 type %T,n1=%v",n1,n1)
结果输出
n1 type int64,n1=127
不管你传入的bitSize是(0、8、16、32、64)中哪一个,结果类型都是int64。
也就是说明,parseInt函数的返回值就是int64的,不是bitSize来决定的。
那bitSize到底什么作用呢,其实bitSize可认为实际上做了校验的功能,比如下面的代码会报错
var str1 string = "1234"
n1, err := strconv.ParseInt(str1, 10, 8)
fmt.Println(n1) // 此时tmp = 127
if err != nil {
log.Fatal(err) // strconv.ParseInt: parsing "1234": value out of range
}
那是因为int8范围为[-128~127]
如果你需要得到其他类型的返回值可以这样干,强制将int64转换成你需要的类型
var n1 int64
n1, _ = strconv.ParseInt("123", 10, 0)
numInt := int(n1)
numUint := uint(n1)
numInt32 := int32(n1)
fmt.Println(numInt, numUint, numInt32)
综上所述,由于go语言是强类型的特性,所以第一个返回值必须是int64类型,因此你的num也必须是int64类型,不管你要转换成什么都必须把num声明成int64,当你知道要转换字符串是在某个范围内,那就把bitSize填成对应位即可,这样转换时也会检查是否越界
网友评论