类型不能混着用

  • 连接两个字符串,使用 + 运算符:

类型间转换 - 图1

  • 如果想连接字符串和数值,是会报错的:

类型间转换 - 图2

  • 整型和浮点类型也不能混着用:

类型间转换 - 图3

数值类型间的转换

  • 下例中,如果想把 age 转化成 浮点类型,需要使用目标类型将其“包裹”起来:

类型间转换 - 图4

从浮点类型转为整数类型

  • 可以从浮点类型转化为整数类型,小数点后边的部分会被截断,而不是舍入:

类型间转换 - 图5

  • 无符号和有符号整数类型之间也需要转换
  • 不同大小的整数类型之间也需要转换

类型转换时需谨慎

  • “环绕行为”:

类型间转换 - 图6

类型间转换 - 图7

  • 可以通过 math 包提供的 max、min 常量,来判断是否超过最大最小值

类型间转换 - 图8

字符串转换

  • 想把 rune、byte 转化为 string,语法是一样的:

类型间转换 - 图9

  • 想把数值转化为string,它的值必须能转化为 code point ,不然无意义。
  • strconv 包的 Itoa 函数就可以做这件事:

类型间转换 - 图10

  • Itoa 是 Integer to ASCII 的意思。
  • Unicode 是 ASCII 的超集,它们前 128 个 code points 是一样的(数字、英文字母、常用标点)。
  • 另外一种把数值转化为 string 的方式是使用 Sprintf 函数,和 Printf 略类似,但是会返回一个 string:

类型间转换 - 图11

  • strconv 包里面还有个 Atoi(ASCII to Integer) 函数。
  • 由于字符串里面可能包含任意字符,或者要转换的数字字符串太大,所以 Atoi 函数可能会发生错误:

类型间转换 - 图12

  • 如果 err 的值为 nil,那么就代表没发生错误。

提示

  • Go 是静态类型语言,一旦某个变量被声明,那么它的类型就无法再改变了。

布尔类型的转换

  • Print 家族的函数,会把 bool 类型的值打印成 true/false 的文本

类型间转换 - 图13

类型间转换 - 图14

  • 注意:如果你想使用 string(false), int(false);bool(1), bool(“yes”) 等类似的方式进行转换,那么 Go 编译器会报错
  • 某些语言里,经常把 1 和 0 当作 true 和 false,但是在 Go 里面不行

作业

  1. 写一个程序,把布尔类型转化为整数类型,true -> 1,false -> 0
  1. package main
  2. import "fmt"
  3. func main() {
  4. launch := true
  5. var num int
  6. if launch {
  7. num = 1
  8. } else {
  9. num = 0
  10. }
  11. fmt.Println(num)
  12. }
  1. 写一个程序,把字符串转化为布尔类型:
    • “true”, “yes”, “1” 是 true
    • “false”, “no”, “0” 是 false
    • 针对其它值,显示错误信息
  1. package main
  2. import "fmt"
  3. func main() {
  4. yesNo := "1"
  5. var launch bool
  6. switch yesNo {
  7. case "true", "yes", "1":
  8. launch = true
  9. case "false", "no", "0":
  10. launch = false
  11. default:
  12. fmt.Println(yesNo, "is not valid")
  13. }
  14. fmt.Println("Ready for launch:", launch)
  15. }