3.6.2. strconv包
strconv包提供了许多用于将字符串和其他类型相互转换的函数。表3.8和表3.9(也可以参考fmt包的打印和扫描函数)列出了这些函数。接下来让我们看几个例子。
一个常见的需求是将字符串表示的值转换为布尔值。我们可以使用 strconv.ParseBool() 函数来实现。
1 2 3 4 5 6 7 8 | for _, truth := range []string{"1", "t", "TRUE", "false", "F", "0", "5"} { if b, err := strconv.ParseBool(truth); err != nil { fmt.Printf("\n{%v}", err) } else { fmt.Print(b, " ") } } fmt.Println() |
1 2 | true·true·true·false·false·false {strconv.ParseBool:·parsing·"5":·invalid·syntax} |
表3.8 strconv包中的函数 #1
参数bs是[]byte类型,base是基数(2至36),bits是位大小,其必须满足以下条件:对于int型,是8、16、32、64或0;对于浮点类型,是32或64.。s是string类型。
strconv.AppendBool(bs, b) | 根据布b的值,在bs后追加true或false |
strconv.AppendFloat(bs, f, fmt, prec, bits) | 在bs后追加float64类型的f,对于其它参数请参考strconv.FormatFloat() |
strconv.AppendInt(bs, i, base) | 根据给定的基数base,在bs后追加int64类型的i |
strconv.AppendQuote(bs, s) | 使用strconv.Quote(),在bs后追加s |
strconv.AppendQuoteRune(bs, char) | 使用strconv. QuoteRune((),在bs后追加rune类型的char |
strconv.AppendQuoteRuneToASCII(bs, char) | 使用strconv. QuoteRuneToASCII(),在bs后追加rune类型的char |
strconv.AppendQuoteToASCII(bs, s) | 使用strconv. QuoteRuneToASCII(),在bs后追加s |
strconv.AppendUInt(bs, base) | 根据给定的基数base,在bs后追加int64类型的u |
strconv.Atoi(s) | 将string类型的s转换为int类型,并返回一个error或nil,参见strconv.ParseInt() |
strconv.CanBackquote(s) | 如果s可以以Go语法中的引号表示,则返回true |
strconv.FormatBool(tf) | 根据tf的值,返回true或false |
strconv.FormatFloat(f, fmt, prec, bits) | 将float64类型的f转换为string类型。其中fmt是字节相关的格式化动作,例如,对于%b是’b’,对于%e是‘e’(参见表3.4)。对于prec,在当fmt为’e’、’E’、’f’时,prec表示小数点后的位数;当fmt为’g’、’G’时,prec表示数值的总的位数;当prec为-1时,表示数值可以使用的最小位数,同时可以使用其它方法(如,使用strconv.ParseFloat()))防止精度损失。bits会影响舍入,通常取值为64 |
strconv.FormatInt(i, base) | 根据给定的基数base,将int64类型的i转换为string类型 |
strconv.FormatUInt(u, base) | 根据给定的基数base,将uint64位的u转换为string类型 |
strconv.IsPrint(c) | 如果rune类型的c是可打印的,则返回true |
strconv.Itoa(i) | 根据给定的基数10,将int类型的i转换为string类型 |
表3.8 strconv包中的函数 #2
strconv.ParseBool(s) | 如果s是”1″、”t”、”T”、”true”、”True”或”TRUE”,则返回true和nil;如果s是s “0”、”f”、”F”、”false”、”False”或”FALSE”,则返回false和nil;否则返回false和error |
strconv.ParseFloat( s, bits) | 如果s可以解析为浮点数,则返回float64类型的值和nil;否则返回0和error;bits应该是64;但是如果转换float32类型的值,bits应该是32 |
strconv.ParseInt( s, base, bits) | 如果s可以解析为整数,则返回int64类型的值和nil;否则返回0和error;如果base是0,意味着将从s(以0x或0X开头,base应是16;以0开头,base应为8;否则base为10)中推断base的值;也可以指定base的值(2至36);如果要转换为int类型,bits应该为0,如果要转换为定长的整型(如对于int16为bits为16),bits应该为该整型的长度 |
trconv.ParseUint( s, base, bits) | 同上,返回uint64和nil或0和error |
strconv.Quote(s) | 返回使用Go语言的单引号字符串语法表示的string类型的s,参见表3.1 |
strconv.QuoteRune( char) | 返回使用Go语言的单引号字符串语法表示的rune类型的Unicode码点char |
strconv.QuoteRuneToASCII(char) | 返回使用Go语言的单引号字符串语法表示的rune类型的Unicode码点char,对于非ASCII字符使用转义 |
strconv.QuoteToASCII(s) | 返回使用Go语言的双引号字符串语法表示的string类型的s,对于非ASCII字符使用转义 |
strconv.Unquote(s) | 返回Go语言中单引号字符或双引号字符串或反引号字符串中的字符串和error |
strconv.UnquoteChar(s, b) | 返回一个rune类型的值(第一个字符)、一个bool类型的值(第一个字符的UTF-8表示是否需要多个字节)、一个string类型的值(字符串的剩余部分)和一个error值;如果b为单引号或双引号,则引号必须转义 |
Strconv包中所有的转换函数都返回一个转换后的值和一个error,如果转换成功,error值为nil。
1 2 3 4 5 6 | x, err := strconv.ParseFloat("-99.7", 64) fmt.Printf("%8T %6v %v\n", x, x, err) y, err := strconv.ParseInt("71309", 10, 0) fmt.Printf("%8T %6v %v\n", y, y, err) z, err := strconv.Atoi("71309") fmt.Printf("%8T %6v %v\n", z, z, err) |
1 2 3 | ·float64··-99.7·<nil> ···int64··71309·<nil> ·····int··71309·<nil> |
上例中strconv.ParseFloat()、strconv.ParseInt()和strconv.Atoi() (ASCII转int类型)函数所能做的工作比我们想象的多。使用strconv. Atoi(s)和使用strconv.ParseInt(s,10,0)可以得到相同的结果,都是解析字符串表示的十进制整数并返回解析后的整数值,只不过Atoi()返回的是int类型,而ParseInt()返回的是int64类型。就像我们所期望的那样,strconv.ParseUint()函数可以将字符串转换为无符号整数,如果给定的字符串以减号开头,则转换失败。对于以上所有函数,如果要转换的字符串开头或结尾处含有空白符,则都会转换失败,但是我们可以使用strings.TrimSpace()函数或使用fmt包中的扫描函数(参见表8.2)来避免这种情况。当然,浮点数转换函数还可以接受以标准计数法和指数计数法表示的字符串作为参数,如”984″、”424.019″和 “3.916e-12″。
1 2 3 4 5 6 7 | s := strconv.FormatBool(z > 100) fmt.Println(s) i, err := strconv.ParseInt("0xDEED", 0, 32) fmt.Println(i, err) j, err := strconv.ParseInt("0707", 0, 32) fmt.Println(j, err) k, err := strconv.ParseInt("10111010001", 2, 32) |
1 2 3 4 | true 57069·<nil> 455·<nil> 1489·<nil> |
strconv.FormatBool()函数可以将给定的布尔值true或false转换为一个字符串表示的布尔表达式。strconv.ParseInt()函数可以将字符串表示的整数转换为int64类型的值,该函数的第二个参数是要使用的基数,为0的话意味着会根据字符串的前缀来判断:”0x” 或”0X”表示十六进制,”0″表示八进制,否则表示十进制。在这段代码中我们根据其前缀转换了一个十六进制和一个八进制数,并显式指定以2为基数转换了一个二进制数。基数的有效范围为2至36,如果基数大于等于10的话,则用A(或a)表示10。第三个参数是位大小(为0表示int类型的大小),所以尽管该函数总是返回int64类型的值,但是仅在能够完全将字符串转化为给定位大小的整数时该转换才会成功。
1 2 3 4 5 | i := 16769023 fmt.Println(strconv.Itoa(i)) fmt.Println(strconv.FormatInt(int64(i), 10)) fmt.Println(strconv.FormatInt(int64(i), 2)) fmt.Println(strconv.FormatInt(int64(i), 16)) |
1 2 3 4 | 16769023 16769023 111111111101111111111111 Ffdfff |
strconv.Itoa()(整数转换为ASCII)函数返回一个基数为10的整数的字符串表示.。strconv.FormatInt()函数以给定的基数(必须指定基数,且范围必须为2至36)将int64类型转换为字符串。
1 2 3 4 | s = "Alle ønsker å være fri." quoted := strconv.Quote(s) fmt.Println(quoted) fmt.Println(strconv.Unquote(quoted)) |
1 2 | "Alle·\u00f8nsker·\u00e5·v\u00e6re·fri." Alle·ønsker·å·være·fri.·<nil> |
strconv.Quote()函数返回一个以Go语言双引号引起来的字符串,并将所有不可打印的ASCII字符和所有非ASCII字符进行转义。(参见表3.1)strconv.Unquote()函数接受一个含有双引号的字符串或一个原生(反引号引起来的)字符串或一个单引号引起来的字符作为参数,并返回一个不带引号的字符串和一个error(或nil)。