类型不能混着用
数值类型间的转换
- 下例中,如果想把 age 转化成 浮点类型,需要使用目标类型将其“包裹”起来:
从浮点类型转为整数类型
- 可以从浮点类型转化为整数类型,小数点后边的部分会被截断,而不是舍入:
- 无符号和有符号整数类型之间也需要转换
- 不同大小的整数类型之间也需要转换
类型转换时需谨慎
- 可以通过 math 包提供的 max、min 常量,来判断是否超过最大最小值
字符串转换
- 想把 rune、byte 转化为 string,语法是一样的:
- 想把数值转化为string,它的值必须能转化为 code point ,不然无意义。
- strconv 包的 Itoa 函数就可以做这件事:
- Itoa 是 Integer to ASCII 的意思。
- Unicode 是 ASCII 的超集,它们前 128 个 code points 是一样的(数字、英文字母、常用标点)。
- 另外一种把数值转化为 string 的方式是使用 Sprintf 函数,和 Printf 略类似,但是会返回一个 string:
- strconv 包里面还有个 Atoi(ASCII to Integer) 函数。
- 由于字符串里面可能包含任意字符,或者要转换的数字字符串太大,所以 Atoi 函数可能会发生错误:
- 如果 err 的值为 nil,那么就代表没发生错误。
提示
- Go 是静态类型语言,一旦某个变量被声明,那么它的类型就无法再改变了。
布尔类型的转换
- Print 家族的函数,会把 bool 类型的值打印成 true/false 的文本
- 注意:如果你想使用 string(false), int(false);bool(1), bool(“yes”) 等类似的方式进行转换,那么 Go 编译器会报错
- 某些语言里,经常把 1 和 0 当作 true 和 false,但是在 Go 里面不行
作业
- 写一个程序,把布尔类型转化为整数类型,true -> 1,false -> 0
package main
import "fmt"
func main() {
launch := true
var num int
if launch {
num = 1
} else {
num = 0
}
fmt.Println(num)
}
- 写一个程序,把字符串转化为布尔类型:
- “true”, “yes”, “1” 是 true
- “false”, “no”, “0” 是 false
- 针对其它值,显示错误信息
package main
import "fmt"
func main() {
yesNo := "1"
var launch bool
switch yesNo {
case "true", "yes", "1":
launch = true
case "false", "no", "0":
launch = false
default:
fmt.Println(yesNo, "is not valid")
}
fmt.Println("Ready for launch:", launch)
}