美文网首页
Go strconv

Go strconv

作者: JunChow520 | 来源:发表于2021-04-21 02:25 被阅读0次

Golang的strconv包主要实现字符串和基本数据类型之间的转换

转换错误处理

字符串转换过程中可能出错,strconv包定义了两个error类型的变量,分别是ErrRangeErrSyntax

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>

相关文章

网友评论

      本文标题:Go strconv

      本文链接:https://www.haomeiwen.com/subject/odvdhltx.html