Go 学习笔记(十一)数据类型转换 (strconv 包)
本文原创地址:博客园骏马金龙Go 基础系列:数据类型转换 (strconv 包)
Go 不会对数据进行隐式的类型转换,只能手动去执行转换操作。
简单的转换操作
转换数据类型的方式很简单。
valueOfTypeB = typeB(valueOfTypeA)
例如:
// 浮点数
a := 5.0
// 转换为int类型
b := int(a)
Go 允许在底层结构相同的两个类型之间互转。例如:
// IT类型的底层是int类型
type IT int
// a的类型为IT,底层是int
var a IT = 5
// 将a(IT)转换为int,b现在是int类型
b := int(5)
// 将b(int)转换为IT,c现在是IT类型
c := IT(b)
但注意:
1、不是所有数据类型都能转换的,例如字母格式的 string 类型 "abcd" 转换为 int 肯定会失败;
2、低精度转换为高精度时是安全的,高精度的值转换为低精度时会丢失精度。例如 int32 转换为 int16,float32 转换为 int;
3、这种简单的转换方式不能对 int(float) 和 string 进行互转,要跨大类型转换,可以使用strconv
包提供的函数。
strconv
strconv 包提供了简单数据类型之间的类型转换功能。可以将简单类型转换为字符串,也可以将字符串转换为其它简单类型。
这个包里提供了很多函数,大概分为几类:
- 字符串转 int:Atoi()
- int 转字符串: Itoa()
- ParseTP 类函数将 string 转换为 TP 类型:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。因为 string 转其它类型可能会失败,所以这些函数都有第二个返回值表示是否转换成功
- 其它类型转 string 类型:FormatBool()、FormatFloat()、FormatInt()、FormatUint()
- AppendTP 类函数用于将 TP 转换成字符串后 append 到一个 slice 中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()
还有其他一些基本用不上的函数,见官方手册:go doc strconv
或者https://golang.org/pkg/strconv/。
当有些类型无法转换时,将报错,返回的错误是 strconv 包中自行定义的 error 类型。有两种错误:
var ErrRange = errors.New("value out of range")
var ErrSyntax = errors.New("invalid syntax")
例如,使用 Atoi("a") 将 "a" 转换为 int 类型,自然是不成功的。如果 print 输出 err 信息,将显示:
strconv.Atoi: parsing "a": invalid syntax
string 和 int 的转换
最常见的是字符串和 int 之间的转换:
1.int 转换为字符串:Itoa()
// Itoa(): int -> string
println("a" + strconv.Itoa(32)) // a32
2.string 转换为 int:Atoi()
func Atoi(s string) (int, error)
由于 string 可能无法转换为 int,所以这个函数有两个返回值:第一个返回值是转换成 int 的值,第二个返回值判断是否转换成功。
// Atoi(): string -> int
i,_ := strconv.Atoi("3")
println(3 + i) // 6
// Atoi()转换失败
i,err := strconv.Atoi("a")
if err != nil {
println("converted failed")
}
Parse 类函数
Parse 类函数用于转换字符串为给定类型的值 :ParseBool()、ParseFloat()、ParseInt()、ParseUint()。
由于字符串转换为其它类型可能会失败,所以这些函数都有两个返回值,第一个返回值保存转换后的值,第二个返回值判断是否转换成功。
b, err := strconv.ParseBool("true")
f, err := strconv.ParseFloat("3.1415", 64)
i, err := strconv.ParseInt("-42", 10, 64)
u, err := strconv.ParseUint("42", 10, 64)
ParseFloat() 只能接收 float64 类型的浮点数。
ParseInt()和 ParseUint() 有 3 个参数:
func ParseInt(s string, base int, bitSize int) (i int64, err error)
func ParseUint(s string, base int, bitSize int) (uint64, error)
bitSize
参数表示转换为什么位的 int/uint,有效值为 0、8、16、32、64。当 bitSize=0 的时候,表示转换为 int 或 uint 类型。例如 bitSize=8 表示转换后的值的类型为 int8 或 uint8。
base
参数表示以什么进制的方式去解析给定的字符串,有效值为 0、2-36。当 base=0 的时候,表示根据 string 的前缀来判断以什么进制去解析:0x
开头的以 16 进制的方式去解析,0
开头的以 8 进制方式去解析,其它的以 10 进制方式解析。
以 10 进制方式解析 "-42",保存为 int64 类型:
i, _ := strconv.ParseInt("-42", 10, 64)
以 5 进制方式解析 "23",保存为 int64 类型:
i, _ := strconv.ParseInt("23", 5, 64)
println(i) // 13
因为 5 进制的时候,23 表示进位了 2 次,再加 3,所以对应的十进制数为5*2+3=13
。
以 16 进制解析 23,保存为 int64 类型:
i, _ := strconv.ParseInt("23", 16, 64)
println(i) // 35
因为 16 进制的时候,23 表示进位了 2 次,再加 3,所以对应的十进制数为16*2+3=35
。
以 15 进制解析 23,保存为 int64 类型:
i, _ := strconv.ParseInt("23", 15, 64)
println(i) // 33
因为 15 进制的时候,23 表示进位了 2 次,再加 3,所以对应的十进制数为15*2+3=33
。
Format 类函数
将给定类型格式化为 string 类型 :FormatBool()、FormatFloat()、FormatInt()、FormatUint()。
s := strconv.FormatBool(true)
s := strconv.FormatFloat(3.1415, 'E', -1, 64)
s := strconv.FormatInt(-42, 16)
s := strconv.FormatUint(42, 16)
FormatInt()和 FormatUint() 有两个参数:
func FormatInt(i int64, base int) string
func FormatUint(i uint64, base int) string
第二个参数 base 指定将第一个参数转换为多少进制,有效值为2<=base<=36
。当指定的进制位大于 10 的时候,超出 10 的数值以 a-z 字母表示。例如 16 进制时,10-15 的数字分别使用 a-f 表示,17 进制时,10-16 的数值分别使用 a-g 表示。
例如:FormatInt(-42, 16)
表示将 -42 转换为 16 进制数,转换的结果为 -2a。
FormatFloat() 参数众多:
func FormatFloat(f float64, fmt byte, prec, bitSize int) string
bitSize 参数表示转换为多少位 (32 或 64) 的浮点数对应的字符串。
Append 类函数
AppendTP 类函数用于将 TP 转换成字符串后 append 到一个 slice 中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()。
Append 类的函数和 Format 类的函数工作方式类似,只不过是将转换后的结果追加到一个 slice 中。
package main
import (
"fmt"
"strconv"
)
func main() {
// 声明一个slice
b10 := []byte("int (base 10):")
// 将转换为10进制的string,追加到slice中
b10 = strconv.AppendInt(b10, -42, 10)
fmt.Println(string(b10))
b16 := []byte("int (base 16):")
b16 = strconv.AppendInt(b16, -42, 16)
fmt.Println(string(b16))
}
输出结果:
int (base 10):-42
int (base 16):-2a