> \n", c.Name)}type American struct { Name string Age int}func (a American) Sing() { fmt.Printf("%._go语言 结构强转成interface">
当前位置:   article > 正文

Go 结构体(struct)实现接口(interface)以及赋值、强转_go语言 结构强转成interface

go语言 结构强转成interface

 1、如果一个结构体实现了interface中的所有方法,那么他们之间可以相互赋值,也可以相互强转

  1. type Hobby interface {
  2. Sing()
  3. }
  4. type Chinese struct {
  5. Name string
  6. }
  7. func (c *Chinese) Sing() {
  8. fmt.Printf("%s am singing <<北京欢迎你!>> \n", c.Name)
  9. }
  10. type American struct {
  11. Name string
  12. Age int
  13. }
  14. func (a American) Sing() {
  15. fmt.Printf("%s am singing <<are you ok !!!>> \n", a.Name)
  16. }
  17. func TestQz(t *testing.T) {
  18. var aa interface{}
  19. var c1 *Chinese
  20. c1 = &Chinese{Name: "小明"}
  21. //aa = b
  22. // c1实现了Hobby中的所有方法,所有可以作为形参传给给Hobby
  23. Avv(c1) // 小明 am singing <<北京欢迎你!>>
  24. // aa不能强转为Chinese类型,因为没有赋值
  25. v, ok := aa.(Chinese)
  26. if ok {
  27. fmt.Println("成功转换001:", v)
  28. } else {
  29. fmt.Println("失败001") // 失败001
  30. }
  31. a := &American{Name: "Jeke"}
  32. aa = a
  33. // a实现了Hobby中的所有方法,所有可以作为形参传给给Hobby
  34. Avv(a) //Jeke am singing <<are you ok !!!>>
  35. // aa可以成功强转American结构体类型
  36. v1, ok := aa.(*American)
  37. if ok {
  38. fmt.Println("成功转换0022:", v1) // 成功转换0022: &{Jeke 0}
  39. } else {
  40. fmt.Println("失败0022")
  41. }
  42. // aa不可以强转为struct{}类型
  43. v2, ok := aa.(*struct {
  44. Name string
  45. Age int
  46. })
  47. if ok {
  48. fmt.Println("成功转换00333:", v2)
  49. } else {
  50. fmt.Println("失败00333") // 失败00333
  51. }
  52. // a可以赋值Hobby, Hobby可以强转a类型,
  53. // 注意:a为指针类型,Hobby只能强转a的指针类型,值类型不行
  54. var hobby Hobby
  55. hobby = a
  56. v3, ok := hobby.(*American)
  57. if ok {
  58. fmt.Println("成功转换004444:", v3) //成功转换004444: &{Jeke 0}
  59. } else {
  60. fmt.Println("失败004444")
  61. }
  62. }
  63. func Avv(a Hobby) {
  64. a.Sing()
  65. }

 2、a赋值给interface类型的b,b只能强转成a的type类型,不能转化为其他类型以及Kind类型

(type类型:系统原生数据类型:如 int、string、bool、float32 等类型,以及使用 type 关键字定义的类型

(Kind类型:种类(Kind)指的是对象归属的品种,在 reflect 包中有如下定义:https://mp.csdn.net/mp_blog/creation/editor/119148976

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. "testing"
  6. )
  7. type Age int
  8. // 强制类型转换
  9. func TestQb(t *testing.T) {
  10. var a interface{}
  11. var b Age
  12. b = 32
  13. a = b
  14. tt := reflect.TypeOf(b)
  15. fmt.Println("类型 Type:", tt.Name()) // 类型 Type: Age
  16. fmt.Println("种类 Kind:", tt.Kind()) // 种类 Kind: int
  17. // a可以转换成b的type类型(系统原生数据类型)
  18. v, ok := a.(Age)
  19. if ok {
  20. fmt.Println("转换成功001:", v) // 转换成功001: 32
  21. } else {
  22. fmt.Println("失败001")
  23. }
  24. // 但a不能转换成b的种类Kind类型
  25. v1, ok := a.(int)
  26. if ok {
  27. fmt.Println("转换成功0022", v1)
  28. } else {
  29. fmt.Println("失败0022") // 失败0022
  30. }
  31. // 但a更不能转换成其他类型
  32. v2, ok := a.(int64)
  33. if ok {
  34. fmt.Println("转换成功00333:", v2)
  35. } else {
  36. fmt.Println("失败00333") // 失败00333
  37. }
  38. v3, ok := a.(string)
  39. if ok {
  40. fmt.Println("转换成功004444:", v3)
  41. } else {
  42. fmt.Println("失败004444") // 失败004444
  43. }
  44. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/907863
推荐阅读
相关标签
  

闽ICP备14008679号