ParseInt 未转换为所需的类型

hor*_*air 2 go

这是我的代码:

包主

import (
    "fmt"
    "reflect"
    "strconv"
)

func main() {
   i, _ := strconv.ParseInt("10", 10, 8)
   fmt.Println(reflect.TypeOf(i))
}
Run Code Online (Sandbox Code Playgroud)

我预计i长度为 8 位( 的第三个参数strconv.ParseInt)。然而,它是 int64 (并且文档声明strconv.ParseInt将返回 int64)。

如果 ParseInt 总是返回 int64,那它还有什么意义(为什么不直接使用 Atoi 呢?)

Eli*_*sky 6

请注意该函数的文档:

bitSize 参数指定结果必须适合的整数类型。位大小 0、8、16、32 和 64 对应于 int、int8、int16、int32 和 int64。对于低于 0 或高于 64 的 bitSize,将返回错误。

因此保证您可以使用 . 将结果转换为字节byte(i)

Go 还没有泛型,因此拥有一个ParseInt可以接受指向多个整数类型的指针的泛型是很困难的。相反,保证是通过bitSize参数完成的


pet*_*rSO 5

包 strconv

import "strconv"
Run Code Online (Sandbox Code Playgroud)

函数解析整数

func ParseInt(s string, base int, bitSize int) (i int64, err error)
Run Code Online (Sandbox Code Playgroud)

ParseInt 以给定基数(0、2 到 36)和位大小(0 到 64)解释字符串 s 并返回相应的值 i。

如果基数 == 0,则基数由字符串的前缀隐含:“0x”基数为 16,“0”基数为 8,否则为基数 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 和符号的最大幅度整数。


例如,

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)

}
Run Code Online (Sandbox Code Playgroud)

游乐场:https://play.golang.org/p/HSHtUnC7qql

输出:

10 int64
10 int8
Run Code Online (Sandbox Code Playgroud)

在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)

}
Run Code Online (Sandbox Code Playgroud)

游乐场:https://play.golang.org/p/HdA3O71U54z

输出:

10 int8
Run Code Online (Sandbox Code Playgroud)