Golang的strconv
包主要实现字符串和基本数据类型之间的转换
转换错误处理
字符串转换过程中可能出错,strconv
包定义了两个error
类型的变量,分别是ErrRange
和ErrSyntax
。
ErrRange
-
ErrRange
表示值超过类型能表示的最大范围,比如将字符串"128"转换为int8
会发生ErrRange
错误。
var ErrRange = errors.New("value out of range")
ErrSyntax
-
ErrSyntax
表示语法错误,比如将空字符串转换为int
会发生ErrSyntax
错误。
var ErrSyntax = errors.New("invalid syntax")
NumError
返回错误时不是直接将错误变量返回,而会通过构造一个NumError
类型的error
对象返回。
type NumError struct{
Func string
Num string
Err error
}
NumError
会记录转换过程中发生的错误信息,实现了error
接口。
func (e *NumError) Error() string{
return "strconv." + e.Func + ": " + "parsing " + Quote(e.Num) + ": " + e.Err.Error()
}
strconv
包中定义了用于构造NumError
对象的函数
函数 | 描述 |
---|---|
syntaxError | 语法错误 |
rangeError | 范围错误 |
baseError | 基础错误 |
bitSizeError | 比特位大小错误 |
Parse
字符串转整型
函数 | 描述 |
---|---|
strconv.ParseInt | 字符串转整型 |
strconv.ParseUint | 字符串转无符号整型 |
strconv.Atoi | ParseInt的便捷版,相当于ParseInt(s, 10, 0) 。 |
strconv.ParseInt
-
strconv.ParseInt
返回字符串表示的整数值,接受正负号。
func ParseInt(s string, base int, bitSize int) (i int64, err error)
参数 | 类型 | 描述 |
---|---|---|
s | string | 待转换的字符串 |
base | int | 进位制,表示字符串按照给定的进制进行解释。 |
bitSize | int | 位宽(包括符号位),表示整数的具体类型。 |
进位制
-
base
取值范围从2到36,比如二进制、八进制、十进制、十六进制等。 -
base
为0是特殊情况会根据字符串前缀判断:前缀0x
表示16进制,前缀0
表示8进制,否则为10进制。
base
为0的内部实现
const intSize = 32 << uint(^uint(0) >> 63)
位宽
bitSize | 类型 |
---|---|
0 | int |
8 | int8 |
16 | int16 |
32 | int32 |
64 | int64 |
返回值
- 若字符串表示的整数超过
bitSize
位宽能够表示的范围则会返回ErrRange
错误,同时会返回bitSize
能够表示的最大或最小值。
例如:将字符串转换为十进制的int8
var s string = "1281"
i, err := strconv.ParseInt(s, 10, 8)
fmt.Printf("value = %d, type = %T\n", i, i) //value = 127, type = int64
fmt.Printf("error = %#v, type = %T\n", err, err)
- 返回的
err
是*strconv.NumError
类型
error = &strconv.NumError{Func:"ParseInt", Num:"1281", Err:(*errors.errorString)(0xc000040010)},
type = *strconv.NumError
-
parseInt
返回的是int64
,为了能够容纳所有的整数。
var s string = "127"
i, err := strconv.ParseInt(s, 10, 8)
fmt.Printf("value = %d, type = %T\n", i, i) //value = 127, type = int64
fmt.Println(err) //<nil>
strconv.Atoi
-
Atoi
字面意思为array to int
,C语言中没有字符串类型,一般会将字符串定义为字符数组。 - 将字符串类型的整数转换为
int
类型,若传入的字符串无法转换则返回错误。
func Atoi(s string) (int, error)
-
strconv.Atoi(s)
内部采用的是strconv.ParseInt(s, 10, 0)
例如:将字符串转换为十进制的int
类型
var s string = "123"
i, err := strconv.Atoi(s)
fmt.Printf("value = %d, type = %T, err = %v\n", i, i, err)
value = 123, type = int, err = <nil>
字符串转布尔值
函数 | 描述 |
---|---|
strconv.ParseBool | 将字符串转换为bool 类型的值 |
strconv.ParseBool
-
strconv.ParseBool
返回字符串表示的布尔值
func ParseBool(str string) (bool, error)
-
strconv.ParseBool
仅接受字符串的1、0、t、f、T、F、true、false、True、False、TRUE、FALSE,其他值均返回错误。
例如:
var str string = "1"
b, err := strconv.ParseBool(str)
fmt.Printf("value = %v, type = %T\n", b, b)
fmt.Printf("error = %v, type = %T\n", err, err)
value = true, type = bool
error = <nil>, type = <nil>
例如:
var str string = "10"
b, err := strconv.ParseBool(str)
fmt.Printf("value = %v, type = %T\n", b, b)
fmt.Printf("error = %v, type = %T\n", err, err)
value = false, type = bool
error = strconv.ParseBool: parsing "10": invalid syntax, type = *strconv.NumError
字符串转浮点数
函数 | 描述 |
---|---|
strconv.ParseFloat | 将字符串转换为单精度浮点数 |
strconv.ParseFloat
-
strconv.ParseFloat
解析一个表示浮点数的字符串并返回其值
func ParseFloat(s string, bitSize int) (float64, error)
参数 | 类型 | 描述 |
---|---|---|
s | string | 表示浮点数的字符串 |
bitSize | int | 期望的接收类型,32表示float32,64表示float64。 |
若s
合法则返回最为接近s
表示值的浮点数,会使用IEEE654规范进行舍入。
例如:
var str string = "3.1415926"
f64, err := strconv.ParseFloat(str, 32)
fmt.Printf("value = %v, type = %T\n", f64, f64)
fmt.Printf("error = %#v, type = %T\n", err, err)
value = 3.141592502593994, type = float64
error = <nil>, type = <nil>
网友评论