基本数据类型的转换
介绍
golang和java/c不同,go在不同类型的变量之间赋值时需要显式转换(强制转换)。也就是说go中数据类型不能自动转换。
基本语法
表达式T(v)将值转换为T
T是数据类型,比如int32,int64,float32等
v是需要转换的变量
案例演示
package main
import (
"fmt"
)
//golang中基本数据类型的转换
func main() {
var i int = 100
//将i转换成float
var b1 float32 = float32(i)
fmt.Printf("b1的类型为:%T,值为:%v", b1, b1) //b1的类型为:float32,值为:100
}
细节说明
- go中,数据类型转换可以从 表示范围小-》表示范围大,也可以表示范围大-〉表示范围小
- 被转换的是变量存储的数据(即值),变量本身的数据类型并没有变化。
- 在转换中,比如将int64转换为int8,编译时不会报错,只是转换的结果会按溢出处理,与希望的结果不一样。
demo:
func main() {
var num1 int64 = 2500
var num2 int8 = int8(num1)
fmt.Printf("num2的类型为%T,值为:%v", num2, num2) //num2的类型为int8,值为:-60
}
练习,类型转换和数值相加
func main() {
var n1 int32 = 12
var n2 int8
var n4 int8
n4 = int8(n1) + 127 //编译通过,但是会溢出,结果不是12+127
n2 = int8(n1) + 128 //编译不通过,直接报错,128超过int8的上界,可以改成n2 = int8(n1+128)
fmt.Println(n4)
fmt.Println(n2)
}
基本数据类型和string的转换
介绍
在开发中,经常需要将基本数据类型转换为string类型;或者将string类型转换为基本数据类型。
基本类型转string
- 方式1:fmt.Sprintf("%参数", 表达式)
demo:
package main
import (
"fmt"
)
//golang中基本数据类型转换到string
func main() {
var num1 int = 99
var num2 float64 = 20.89
var b bool = true
var char byte = 'h'
var str string
//使用第一种方式转换fmt.Sprintf
str = fmt.Sprintf("%d", num1)
fmt.Printf("str的类型%T,str的值为:%v \n", str, str) //str的类型string,str的值为:99
str = fmt.Sprintf("%f", num2)
fmt.Printf("str的类型%T,str的值为:%v\n", str, str) //str的类型string,str的值为:20.890000
str = fmt.Sprintf("%t", b)
fmt.Printf("str的类型%T,str的值为:%q\n", str, str) //%q:该值对应的双引号括起来的go语法字符串字面值
//输出结果:str的类型string,str的值为:"true"
str = fmt.Sprintf("%c", char)
fmt.Printf("str的类型%T,str的值为:%q\n", str, str) //str的类型string,str的值为:"h"
}
- 方式2:使用strconv包的函数。
demo:
package main
import (
"fmt"
"strconv"
)
//golang中基本数据类型转换到string
func main() {
//第二种方式
var num3 int = 99
var num4 float64 = 23.456
var b2 bool = false
str = strconv.FormatInt(int64(num3), 10)
fmt.Printf("str的类型%T,str的值为:%q\n", str, str) //str的类型string,str的值为:"99"
str = strconv.FormatFloat(num4, 'f', 10, 64)
//‘f’代表格式 10:表示小数位保留10位 64:表示这个浮点数是float64
fmt.Printf("str的类型%T,str的值为:%q\n", str, str) //str的类型string,str的值为:"23.4560000000"
str = strconv.FormatBool(b2)
fmt.Printf("str的类型%T,str的值为:%q\n", str, str) //str的类型string,str的值为:"false"
//strconv包中有一个函数Itoa
var num5 int = 4567
str = strconv.Itoa(num5)
fmt.Printf("str的类型%T,str的值为:%q\n", str, str)//str的类型string,str的值为:"4567"
}
String类型转换为基本数据类型
- 使用strconv包的函数
demo:
package main
import (
"fmt"
"strconv"
)
//golang中string转换到基本数据类型
func main() {
var str string = "true"
var b bool
b, _ = strconv.ParseBool(str)
//函数会返回两个值(value bool, err error),只想获取value bool,不想获取err ,所以使用_忽略
fmt.Printf("b的类型%T,b的值为:%v\n", b, b) //b的类型bool,b的值为:true
var str2 string = "123456"
num1, _ := strconv.ParseInt(str2, 10, 0)
fmt.Printf("num1的类型%T,num1的值为:%v\n", num1, num1) //num1的类型int64,num1的值为:123456
var str3 string = "12.345"
num2, _ := strconv.ParseFloat(str3, 64)
fmt.Printf("num2的类型%T,num2的值为:%v\n", num2, num2) //num2的类型float64,num2的值为:12.345
}
note :返回的值为int64或者float64,因此如果希望得到int32或者float32可以使用基本类型转换
String类型转换为基本数据类型注意事项
在将string类型转换为基本数据类型时,要确保string类型能够转换成有效的数据。比如可以把“123”转换成一个整数,但不能把“hello”转换成一个整数,如果这样做,go直接把它转成0,其他类型类似float->0, bool->false。
demo:
func main() {
var str4 string = "hello"
var n3 int64
n3, _ = strconv.ParseInt(str4, 10, 64)
fmt.Printf("n3的类型%T,n3的值为:%v\n", n3, n3) //n3的类型int64,n3的值为:0
}
demo2
func main() {
var str string = "hello"
var b bool
b, _ = strconv.ParseBool(str)
fmt.Printf("b的类型%T,b的值为:%v\n", b, b) //b的类型bool,b的值为:false
}