这是我的代码:
软件包主要
import (
"fmt"
"reflect"
"strconv"
)
func main() {
i, _ := strconv.ParseInt("10", 10, 8)
fmt.Println(reflect.TypeOf(i))
}
我希望i
的长度为8位(strconv.ParseInt
的第3个参数)。但是它是int64(并且文档指出strconv.ParseInt
将返回int64)。
如果ParseInt总是返回int64(为什么不仅仅使用Atoi?),那又有什么意义呢?
答案 0 :(得分:3)
请注意该函数的文档:
bitSize参数指定结果必须必须的整数类型 适合。位大小0、8、16、32和64对应于int,int8, int16,int32和int64。对于小于0或大于64的bitSize,将出现错误 返回。
因此可以保证您可以使用byte(i)
将结果转换为字节。
Go还没有泛型,因此很难拥有一个可以接受指向多个整数类型的指针的ParseInt
。相反,可以通过bitSize
参数
答案 1 :(得分:2)
import "strconv"
func ParseInt(s string, base int, bitSize int) (i int64, err error)
ParseInt解释给定基数(0、2到36)和位中的字符串s 大小(0到64)并返回相应的值i。
如果base == 0,则字符串的前缀隐含基数:base 16 for “ 0x”,以8为底的“ 0”,否则以10为底。对于基数1,小于0或 高于36则返回错误。
bitSize参数指定结果必须必须的整数类型 适合。位大小0、8、16、32和64对应于int,int8, int16,int32和int64。对于小于0或大于64的bitSize,将出现错误 返回。
ParseInt返回的错误的具体类型为* NumError和 包括err.Num = s。如果s为空或包含无效数字,则为err.Err = ErrSyntax,返回值为0;如果与s对应的值不能用给定大小的有符号整数表示,则为err.Err = ErrRange,返回值是适当的bitSize和sign的最大大小整数。
例如,
package main
import (
"fmt"
"strconv"
)
func main() {
i64, err := strconv.ParseInt("10", 10, 8)
if err != nil {
panic(err)
}
fmt.Printf("%[1]d %[1]T\n", i64)
i8 := int8(i64)
fmt.Printf("%[1]d %[1]T\n", i8)
}
游乐场:https://play.golang.org/p/HSHtUnC7qql
输出:
10 int64
10 int8
在Go中,我们经常使用函数来隐藏实现细节。
例如,
package main
import (
"fmt"
"strconv"
)
func ParseInt8(s string, base int) (int8, error) {
i64, err := strconv.ParseInt(s, base, 8)
return int8(i64), err
}
func main() {
i8, err := ParseInt8("10", 10)
if err != nil {
panic(err)
}
fmt.Printf("%[1]d %[1]T\n", i8)
}
游乐场:https://play.golang.org/p/HdA3O71U54z
输出:
10 int8
答案 2 :(得分:1)
我认为您真正要问的是ParseInt()的第3个参数的意义。
这样可以省去手动检查溢出的麻烦:
i, err := strconv.Atoi(intString)
if err != nil || i < -128 || i > 127 {
// handle error
}
i8 := int8(i)