这是我的代码:
包主
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 呢?)
请注意该函数的文档:
bitSize 参数指定结果必须适合的整数类型。位大小 0、8、16、32 和 64 对应于 int、int8、int16、int32 和 int64。对于低于 0 或高于 64 的 bitSize,将返回错误。
因此保证您可以使用 . 将结果转换为字节byte(i)。
Go 还没有泛型,因此拥有一个ParseInt可以接受指向多个整数类型的指针的泛型是很困难的。相反,保证是通过bitSize参数完成的
Run Code Online (Sandbox Code Playgroud)import "strconv"Run Code Online (Sandbox Code Playgroud)func ParseInt(s string, base int, bitSize int) (i int64, err error)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)
| 归档时间: |
|
| 查看次数: |
1869 次 |
| 最近记录: |