1、go不会对数据进行隐式的类型转换,只能手动去执行转换操作。
1)转换数据类型的方式很简单,例如:
// 浮点数
a := 5.0
// 转换为int类型
b := int(a)
2)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)
- 不是所有数据类型都能转换的,例如字母格式的string类型"abcd"转换为int肯定会失败
- 低精度转换为高精度时是安全的,高精度的值转换为低精度时会丢失精度。例如int32转换为int16,float32转换为int
- 这种简单的转换方式不能对int(float)和string进行互转,要跨大类型转换,可以使用strconv包提供的函数
2、strconv
strconv包提供了字符串与简单数据类型之间的类型转换功能。可以将简单类型转换为字符串,也可以将字符串转换为其它简单类型。
这个包里提供了很多函数,大概分为几类:
- 字符串转int:Atoi()
- int转字符串: Itoa()
- ParseTP类函数将string转换为TP类型:ParseBool()、ParseFloat()、ParseInt()、ParseUint()。因为string转其它类型可能会失败,所以这些函数都有第二个返回值表示是否转换成功
- FormatTP类函数将其它类型转string:FormatBool()、FormatFloat()、FormatInt()、FormatUint()
- AppendTP类函数用于将TP转换成字符串后append到一个slice中:AppendBool()、AppendFloat()、AppendInt()、AppendUint()
还有其他一些基本用不上的函数,见官方手册:go doc strconv或者https://golang.org/pkg/strconv/。
1)当有些类型无法转换时,将报错,返回的错误是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
2)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")
}
3、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类型:因为5进制的时候,23表示进位了2次,再加3,所以对应的十进制数为5*2+3=13
i, _ := strconv.ParseInt("23", 5, 64)
println(i) // 13
以16进制解析23,保存为int64类型:因为16进制的时候,23表示进位了2次,再加3,所以对应的十进制数为16*2+3=35。
i, _ := strconv.ParseInt("23", 16, 64)
println(i) // 35
以15进制解析23,保存为int64类型:因为15进制的时候,23表示进位了2次,再加3,所以对应的十进制数为15*2+3=33。
i, _ := strconv.ParseInt("23", 15, 64)
println(i) // 33