Go 语言中只有强制类型转换,没有隐式类型转换。
1. 数值类型之间的相互转换
1.1. 整型和整型之间的转换
package main
import "fmt"
func main() {
var a int8 = 20
var b int16 = 40
fmt.Println(int16(a) + b)
// 60
}
1.2. 浮点型和浮点型之间的转换
package main
import "fmt"
func main() {
var a float32 = 20
var b float64 = 40
fmt.Println(float64(a) + b)
// 60
}
1.3. 整型和浮点型之间的转换
package main
import "fmt"
func main() {
var a float32 = 20.23
var b int = 40
fmt.Println(a + float32(b))
// 60.23
}
注意:转换的时候建议从低位转换成高位,高位转换成低位的时候如果转换不成功就会溢出,和我们想的结果不一样。
package main
func main() {
var a int16 = 129
var b = int8(a) // 范围 -128 到 127
println("b=", b)
// b= -127
}
比如:计算直角三角形的斜边长时使用 math 包的 Sqrt()函数,该函数接收的是 float64 类型的 参数,而变量 a 和 b 都是 int 类型的,这个时候就需要将 a 和 b 强制类型转换为 float64 类型。
package main
import "fmt"
import "math"
func main() {
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是 float64 类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
// 5
}
2. 其他类型转换成 string 类型
2.1. 通fmt.Sprintf() 把其他类型转换成 String 类型
package main
import ("fmt")
func main() {
var i int = 20
str1 := fmt.Sprintf("%d", i)
fmt.Printf("值:%v 类型:%T\n", str1, str1)
// 值:20 类型:string
var f float64 = 12.456
str2 := fmt.Sprintf("%.2f", f)
fmt.Printf("值:%v 类型:%T\n", str2, str2)
// 值:12.46 类型:string
var t bool = true
str3 := fmt.Sprintf("%t", t)
fmt.Printf("值:%v 类型:%T\n", str3, str3)
// 值:true 类型:string
var b byte = 'a'
str4 := fmt.Sprintf("%c", b)
fmt.Printf("值:%v 类型:%T\n", str4, str4)
// 值:a 类型:string
}
Sprintf 使用中需要注意转换的格式 int为%d ,float为%f, bool为%t,byte为%c
2.2. 通过strconv 把其他类型转换成string类型
package main
import (
"fmt"
"strconv"
)
func main() {
// 整型转成字符串
// FormatInt()
// 参数1:int64的数值
// 参数2:传值int类型的进制
var i int = 20
str1 := strconv.FormatInt(int64(i), 10)
fmt.Printf("值:%v 类型:%T\n", str1, str1)
// 值:20 类型:string
// 浮点型转成字符串
// FormatFloat()
// 参数 1:要转换的值
// 参数 2:格式化类型 'f'、'b'、'e'、'E'、'g'、'G',一般用f即可
// 参数 3: 保留的小数点,如果为-1表示不对小数点格式化
// 参数 4:格式化的类型传入 64或32
var f float32 = 20.231313
str2 := strconv.FormatFloat(float64(f), 'f', 4, 32)
fmt.Printf("值:%v 类型:%T\n", str2, str2)
// 值:20.2313 类型:string
// 布尔型转成字符串,没有任何意义
str3 := strconv.FormatBool(true)
fmt.Printf("值:%v 类型:%T\n", str3, str3)
// 值:true 类型:string
// 字符转成字符串,没有任何意义
a:='b'
str4 := strconv.FormatUint(uint64(a), 10)
fmt.Printf("值:%v 类型:%T\n", str4, str4)
//值:98 类型:string
}
3. String 类型转换成数值类型
package main
import (
"fmt"
"strconv"
)
func main() {
// 字符串类型转换成整型
// ParseInt()
// 参数1:string数据
// 参数2:进制
// 参数3:位数 16、32、64
str1:= "123456"
num1,_:= strconv.ParseInt(str1, 10, 64)
fmt.Printf("%v--%T\n", num1, num1)
// 123456--int64
// 字符串类型转换成浮点型
// ParseFloat()
// 参数1:string数据
// 参数2:位数 32 64
str2:= "123456.333xxxx"
float2,_:= strconv.ParseFloat(str2, 64)
fmt.Printf("%v--%T\n", float2, float2)
// 0--float64
// 字符串类型转换成布尔型=>不建议这样转
bool3, _ := strconv.ParseBool("xxxxxxx")
fmt.Printf("值:%v 类型:%T\n", bool3, bool3)
// 值:false 类型:bool
}
4. 数值类型没法和 bool 类型进行转换
注意:在 go 语言中数值类型没法直接转换成 bool 类型,bool 类型也没法直接转换成数值类型。