go断言类型实战

我会带着你远行 2021-07-24 13:07 574阅读 0赞

一 实战1

1 需求

给 Phone 结构体增加一个特有的方法 call(), 当 Usb 接口接收的是 Phone 变量时,需要调用 call方法。

2 代码

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // 声明/定义一个接口
  6. type Usb interface {
  7. // 声明了两个没有实现的方法
  8. Start()
  9. Stop()
  10. }
  11. type Phone struct {
  12. name string
  13. }
  14. // 让 Phone 实现 Usb接口的方法
  15. func (p Phone) Start() {
  16. fmt.Println("手机开始工作。。。")
  17. }
  18. func (p Phone) Stop() {
  19. fmt.Println("手机停止工作。。。")
  20. }
  21. // Phone 结构体特有的方法
  22. func (p Phone) Call() {
  23. fmt.Println("手机 在打电话..")
  24. }
  25. type Camera struct {
  26. name string
  27. }
  28. // 让 Camera 实现 Usb接口的方法
  29. func (c Camera) Start() {
  30. fmt.Println("相机开始工作。。。")
  31. }
  32. func (c Camera) Stop() {
  33. fmt.Println("相机停止工作。。。")
  34. }
  35. type Computer struct {
  36. }
  37. func (computer Computer) Working(usb Usb) {
  38. usb.Start()
  39. // 当 usb 指向 Phone 结构体变量,调用 Call 方法
  40. // 类型断言
  41. if phone, ok := usb.(Phone); ok {
  42. phone.Call()
  43. }
  44. usb.Stop()
  45. }
  46. func main() {
  47. // 定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量
  48. // 这里体现出多态数组
  49. var usbArr [3]Usb
  50. usbArr[0] = Phone{"vivo"}
  51. usbArr[1] = Phone{"小米"}
  52. usbArr[2] = Camera{"尼康"}
  53. // 遍历 usbArr
  54. // Phone 还有一个特有的方法 call(),遍历 Usb 数组,如果是 Phone 变量,除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call
  55. var computer Computer
  56. for _, v := range usbArr {
  57. computer.Working(v)
  58. fmt.Println()
  59. }
  60. }

3 测试

  1. 手机开始工作。。。
  2. 手机 在打电话..
  3. 手机停止工作。。。
  4. 手机开始工作。。。
  5. 手机 在打电话..
  6. 手机停止工作。。。
  7. 相机开始工作。。。
  8. 相机停止工作。。。

二 实战2

1 需求

写一函数,循环判断传入参数的类型。

2 代码

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. // 定义 Student 类型
  6. type Student struct {
  7. }
  8. // 编写一个函数,可以判断输入的参数是什么类型
  9. func TypeJudge(items ...interface{}) {
  10. for index, x := range items {
  11. switch x.(type) {
  12. case bool:
  13. fmt.Printf("第%v个参数是 bool 类型,值是%v\n", index, x)
  14. case float32:
  15. fmt.Printf("第%v个参数是 float32 类型,值是%v\n", index, x)
  16. case float64:
  17. fmt.Printf("第%v个参数是 float64 类型,值是%v\n", index, x)
  18. case int, int32, int64:
  19. fmt.Printf("第%v个参数是 整数 类型,值是%v\n", index, x)
  20. case string:
  21. fmt.Printf("第%v个参数是 string 类型,值是%v\n", index, x)
  22. case Student:
  23. fmt.Printf("第%v个参数是 Student 类型,值是%v\n", index, x)
  24. case *Student:
  25. fmt.Printf("第%v个参数是 *Student 类型,值是%v\n", index, x)
  26. default:
  27. fmt.Printf("第%v个参数是 类型 不确定,值是%v\n", index, x)
  28. }
  29. }
  30. }
  31. func main() {
  32. var n1 float32 = 1.1
  33. var n2 float64 = 2.3
  34. var n3 int32 = 30
  35. var name string = "tom"
  36. address := "北京"
  37. n4 := 300
  38. stu1 := Student{}
  39. stu2 := &Student{}
  40. TypeJudge(n1, n2, n3, name, address, n4, stu1, stu2)
  41. }

3 测试

  1. 0个参数是 float32 类型,值是1.1
  2. 1个参数是 float64 类型,值是2.3
  3. 2个参数是 整数 类型,值是30
  4. 3个参数是 string 类型,值是tom
  5. 4个参数是 string 类型,值是北京
  6. 5个参数是 整数 类型,值是300
  7. 6个参数是 Student 类型,值是{}
  8. 7个参数是 *Student 类型,值是&{}

发表评论

表情:
评论列表 (有 0 条评论,574人围观)

还没有评论,来说两句吧...

相关阅读

    相关 typescript类型断言

    作用: 通过类型断言这种方式可以告诉编译器,“相信我,我知道自己在干什么”,你会比 TypeScript 更了解某个值的详细信息,你清楚的知道一个实体具有比它现有类型更确