基本数据类型的相互转换

Go在不同类型的变量之间赋值时需要显示转换,不能自动转换

  1. // 基本语法
  2. // 表达式 T(v) 将值v转换成类型T
  3. // T就是数据类型: int32, int64, float32...
  4. // v就是需要转换的变量
  5. // 不考虑溢出的情况下,类型转换不会改变数值大小
  6. var i int8 = 100
  7. var n int32 = int32(i)
  8. fmt.Println(i, n) // 100 100
  9. // 不支持隐式转换, 代码检查不通过,编译不能通过
  10. var n1 int32 = 30
  11. var n2 int16
  12. var n3 int64
  13. // cannot use n1 + 2 (value of type int32) as int16 value in assignment
  14. n2 = n1 + 2 // n1为int32, n1 + 2得到的还是int32类型, 而n2是int16类型
  15. n3 = n1 + 2 // 同上
  16. fmt.Println(n1, n2, n3) // cannot use n1 + 2 (type int32) as type int16 in assignment
  17. // 修改如下:
  18. // 显示转换
  19. n2 = int16(n1) + 2 // n1为int32, n2为int16, 所以先把加数n1转换成int16, 再做加法
  20. n3 = int64(n1) + 2 // 同上
  21. fmt.Println(n1, n2, n3) // 30 32 32
  22. // 溢出测试
  23. var n1 int32 = 12
  24. var n2 int8
  25. var n3 int8
  26. n2 = int8(n1) + 127
  27. n3 = int8(n1) + 128 // 128代码检查报错, constant 128 overflows int8
  28. fmt.Println(n1, n2, n3)
  29. // 修改如下
  30. // 这时候语言检查是没有问题的
  31. // 计算结果超出类型范围,溢出处理
  32. n2 = int8(n1) + 127
  33. n3 = int8(n1) + 120
  34. fmt.Println(n1, n2, n3)
  35. // 输出 12 -117 -124

image.png
小知识

  1. package main
  2. // import "unsafe"
  3. // import "fmt"
  4. import (
  5. _ "fmt" // 如果引入一个包没有使用,但是又不想删除,可以再前面加一个 _ 表示忽略
  6. _ "unsafe"
  7. )
  8. func main() {
  9. }

基本数据类型和string的转换

  1. // 方法一:
  2. fmt.Sprintf("%参数", 表达式)
  3. func main() {
  4. var n int = 10
  5. var n1 float64 = 12.56
  6. var b bool = false
  7. var myChar byte = 'h'
  8. var str string
  9. str = fmt.Sprintf("%d", n)
  10. fmt.Printf("%T %v\n", str, str) // string 10
  11. str = fmt.Sprintf("%f", n1)
  12. fmt.Printf("%T %v\n", str, str) // string 12.560000
  13. str = fmt.Sprintf("%t", b)
  14. fmt.Printf("%T %q\n", str, str) // string "false"
  15. str = fmt.Sprintf("%q", myChar)
  16. fmt.Printf("%T %q\n", str, str) // string "'h'"
  17. }
  18. // 方法二:
  19. // 使用 strconv 包的函数
  20. func FormatBool(b bool) string
  21. func FormatInt(i int64, base int) string
  22. func FormatUint(i uint64, base int) string
  23. func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  24. func Itoa(i int) string
  25. // strconv 包函数转换
  26. var num3 int = 99
  27. var num4 float64 = 23.456
  28. var b2 bool = true
  29. var num5 int = 4567
  30. str = strconv.FormatInt(int64(num3), 10)
  31. fmt.Printf("%T %q\n", str, str) // string "99"
  32. str = strconv.FormatFloat(float64(num4), 'f', 10, 64)
  33. // 4个参数描述: f, fmt(表示格式), prec(控制精度), bitSize(表示f的来源类型(32:float32、64:float64))
  34. fmt.Printf("%T %q\n", str, str) // string "23.4560000000"
  35. str = strconv.FormatBool(b)
  36. fmt.Printf("%T %q\n", str, str) // string "true"
  37. str = strconv.Itoa(num5)
  38. fmt.Printf("%T %q\n", str, str) // string "4567"

string和基本数据类型转换

注意事项:
转成基本数据类型的时候,确保string类型能够转成有效的数据,比如把”123”转成整数123,
不能把别的字符串,类似”hello”,转成整数,Golang直接将其转成默认零值0

  1. // 使用 strconv 包的函数
  2. func ParseBool(str string) (value bool, err error)
  3. // 以下三个返回值是64为,必须用64位的类型去接收,如果需要32位,则手动转
  4. func ParseInt(s string, base int, bitSize int) (i int64, err error)
  5. func ParseUint(s string, base int, bitSize int) (n uint64, err error)
  6. func ParseFloat(s string, bitSize int) (f float64, err error)
  7. var str string = "true"
  8. var b bool
  9. // b, _ = strconv.ParseBool(str)
  10. // func strconv.ParseBool(str string) (bool, error)
  11. // 1、返回两个值,一个是转换的bool值,一个是error
  12. // 2、我们只需要拿到第一个返回值, 第二个忽略
  13. b, _ = strconv.ParseBool(str)
  14. fmt.Printf("%T %v\n", b, b) // bool true
  15. var str2 string = "123"
  16. var n int64
  17. var n2 int
  18. n, _ = strconv.ParseInt(str2, 10, 64)
  19. n2 = int(n) // int64转成int
  20. fmt.Printf("%T %v\n", n, n) // int64 123
  21. fmt.Printf("%T %v\n", n2, n2) // int 123
  22. var str3 string = "123.456"
  23. var f1 float64
  24. f1, _ = strconv.ParseFloat(str3, 64)
  25. fmt.Printf("%T %v\n", f1, f1) // float64 123.456
  26. // 注意, 默认零值
  27. var str4 string = "hello"
  28. var f2 float64
  29. var b2 bool = true // 不管原来是什么值,如果没有转成功,就会置为false
  30. f2, _ = strconv.ParseFloat(str4, 64)
  31. fmt.Printf("%T %v\n", f2, f2)
  32. b2, _ = strconv.ParseBool(str4) // float64 0
  33. fmt.Printf("%T %v\n", b2, b2) // bool false