Go标准库学习:strconv

发布时间 2023-11-28 17:22:38作者: 流云cpp

strconv包

strconv包主要包括进行数值类型和字符串/字节数组进行转换的函数,还有部分给字符(串)添加引用的函数。

主要是对官网文档的总结和翻译。

官网:https://pkg.go.dev/strconv@go1.21.4

常量

const IntSize = intSize

表示Int类型的字节长度,32位平台为4,64位平台为8.

变量

var ErrRange = errors.New("value out of range")
var ErrSyntax = errors.New("invalid syntax")

函数

最常用的:整型转字符串(itoa)、字符串转整型(atoi)

func Atoi(s string) (int, error)
func Itoa(i int) string

Atoi将(十进制)字符串转化为整型(int),Itoa将整型转化为字符串。

数值类型格式化为字符串

// bool类型转化为字符串,返回值为true或者false
func FormatBool(b bool) string
// 将有符号整型转化为字符串,2 <= base <= 36,用阿拉伯数字表示10以下的数字,a-z表示大于等于十的数字
func FormatInt(i int64, base int) string
// 将无符号整型转化为字符串,2 <= base <= 36,用阿拉伯数字表示10以下的数字,a-z表示大于等于十的数字
func FormatUint(i uint64, base int) string
// 比较复杂,见下面的解析
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
// 格式化形式为(a+bi),其中a为实部,b为虚部。bitSize为64/128
func FormatComplex(c complex128, fmt byte, prec, bitSize int) string

需要注意的是,这组函数的参数都是各种类型中位宽最大的类型。

FormatFloat()函数是这组函数中最复杂的,其各字段意义如下:

  1. fmt,表示浮点数格式化的形式,可选的形式如下:
    • 'b'. -ddddp±ddd 二进制指数表示形式
    • 'e'. -d.dddde±dd 十进制指数表示形式,也就是常说的“科学计数法”
    • 'E'. -d.ddddE±dd 十进制指数表示形式
    • 'f'. -ddd.dddd 十进制,没有指数
    • 'g'. 对于大数表示为'e'的形式,其他表示为'f'的形式
    • 'G'. 对于大数表示为'E'的形式,其他表示为'f'的形式
    • 'x'. -0xd.ddddp±ddd 十六进制小数和二进制指数
    • 'X'. -0Xd.ddddP±ddd 十六进制小数和二进制指数

我觉得'f'和'g'应该是最常用的。

  1. pre 控制 'e', 'E', 'f', 'g', 'G', 'x', 'X' 打印的位数,对于:

    • 'e', 'E', 'f', 'x', 'X':小数点后面的位数
    • 'g', 'G':最大有效位数,后面的0被忽略。

如果pre被设置为-1,则表示ParseFloat能返回准确的f所需要的精度,我觉得这是最常用的。

  1. bitSize,表示位宽,32或64.

将字符串转化为数值类型

// 将字符串转化为bool值,
// 可接受的值:1, t, T, TRUE, true, True, 0, f, F, FALSE, false, False.
// 其他值都被认为是false
func ParseBool(str string) (bool, error)
// 将N, Ni, 或者 N±Ni 形式的字符串转化为复数,其中N可表示为浮点数
func ParseComplex(s string, bitSize int) (complex128, error)
// 将字符串转化为浮点数
func ParseFloat(s string, bitSize int) (float64, error)
// 将字符串转化为整数,base表示进制
func ParseInt(s string, base int, bitSize int) (i int64, err error)
// 将字符串转化为无符号整型
func ParseUint(s string, base int, bitSize int) (uint64, error)

将格式化后的字符串添加到[]byte后面

func AppendBool(dst []byte, b bool) []byte
func AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int) []byte
func AppendInt(dst []byte, i int64, base int) []byte
func AppendUint(dst []byte, i uint64, base int) []byte

这部分函数与Format系列的函数相似,只不过是将转化后的结果添加都一个[]byte后面。

反引号相关的

func CanBackquote(s string) bool

该函数返回字符串s能否表示为一个 单行的 、 不包含除了空格和制表符之外的特殊字符的 反引号引用的 字符串。

说实话我不知道这个函数有什么用。

辅助函数

// 判断r是不是被unicode定义为图片,包括:字母、标记、数字、标点符号、符号和空白字符。
func IsGraphic(r rune) bool
// 判断r是不是可以被Go打印,和unicode.IsPrint()是相同的。
// 包括:字母、数字、标点符号、符号和空白字符。
func IsPrint(r rune) bool

用于辅助其他函数,但导出了,感觉不应该出现在这个包里。

给字符/字符串添加引用/去掉引用

// 返回Go双引号引用的 Go字面量表示的 字符串s。对于控制字符和不可打印的字符(!IsPrint),
//  使用Go转义序列进行表示(\t, \n, \xFF, \u0100)。
func Quote(s string) string
// 类似Quote,但对于非ASCII符号表示为Go转义序列。
func QuoteToASCII(s string) string
// 类似Quote,但对于 控制字符 和 非图片字符(!IsGraphic) 使用Go转义序列表示
func QuoteToGraphic(s string) string
// 返回Go单引号引用的 Go字面量表示的 字符串s。对于控制字符和不可打印的字符(!IsPrint),
//  使用Go转义序列进行表示
func QuoteRune(r rune) string
// 类似QuoteRune,但对于非ASCII符号表示为Go转义序列。
func QuoteRuneToASCII(r rune) string
// 类似QuoteRune,但对于控制字符和非图片字符使用Go转义序列表示
func QuoteRuneToGraphic(r rune) string
// 返回被引号(单引号【引用单个字符】、双引号【引用字符串】、反引号【引用字符串】)引用的前缀,如果没有被引号引用的前缀则返回错误。
func QuotedPrefix(s string) (string, error)
// 将s解释为引号引用的字符串,返回去掉该引号后的字符串。
//  注意,如果引号为单引号,则被引用的应该只有一个unicode字符。
func Unquote(s string) (string, error)
// 比较复杂,我将英文原文写在下面,可自行解读
//  大致意思就是将s进行解码,返回解码后的字符、该字符是否是多字节的、后续的字符串。
//  quote表示解码方式,可选为单引号、双引号和0
func UnquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error)

UnquoteChar()函数的官网解释:

UnquoteChar decodes the first character or byte in the escaped string or character literal represented by the string s. It returns four values:

  1. value, the decoded Unicode code point or byte value;
  2. multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation;
  3. tail, the remainder of the string after the character; and
  4. an error that will be nil if the character is syntactically valid.

The second argument, quote, specifies the type of literal being parsed and therefore which escaped quote character is permitted. If set to a single quote, it permits the sequence ' and disallows unescaped '. If set to a double quote, it permits " and disallows unescaped ". If set to zero, it does not permit either escape and allows both quote characters to appear unescaped.

类型

NumError

type NumError struct {
	Func string // 出错的函数 (ParseBool, ParseInt, ParseUint, ParseFloat, ParseComplex)
	Num  string // 输入
	Err  error  // 转换错误的原因 (比如 ErrRange, ErrSyntax, 等.)
}

将字符串转化为数值类型时,返回的错误时真实的类型为NumError。

str := "Not a number"
if _, err := strconv.ParseFloat(str, 64); err != nil {
  e := err.(*strconv.NumError)
  fmt.Println("Func:", e.Func)
  fmt.Println("Num:", e.Num)
  fmt.Println("Err:", e.Err)
  fmt.Println(err)
}

/*
Output:
Func: ParseFloat
Num: Not a number
Err: invalid syntax
strconv.ParseFloat: parsing "Not a number": invalid syntax
*/

成员函数:

func (e *NumError) Error() string
func (e *NumError) Unwrap() error