当前位置:   article > 正文

go reflect的用法

go reflect

总结:

1. go语言支持反射即reflect,核心包括两方面:类型(reflect.Type)、值(reflect.Value)

2. reflect  可以获取到变量、结构体的类型和值

3. reflect 可以根据类型(reflect.Type)新产生一个对象

 

实验如下图

代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. )
  6. // 自定义结构体
  7. type User struct {
  8. ID int32
  9. Name string
  10. }
  11. func (u User) GetName() string {
  12. return u.Name
  13. }
  14. // 接口:人
  15. type Person interface {
  16. GetHP() int32
  17. }
  18. // 男人
  19. type Man struct {
  20. }
  21. func (m Man) GetHP() int32 {
  22. return 100
  23. }
  24. // 女人
  25. type Woman struct {
  26. }
  27. func (w Woman) GetHP() int32 {
  28. return 200
  29. }
  30. func main() {
  31. 基本类型 //
  32. fmt.Println("整形")
  33. var a int = 555
  34. fmt.Println(reflect.TypeOf(a))
  35. fmt.Println(reflect.ValueOf(a)) // Valueof()就是取变量的值
  36. fmt.Println("")
  37. fmt.Println("字符串")
  38. fmt.Println(reflect.TypeOf("999"))
  39. fmt.Println(reflect.ValueOf("999")) // Valueof()就是取变量的值
  40. fmt.Println("")
  41. fmt.Println("数组")
  42. arr := []int32{1, 2, 3}
  43. fmt.Println(reflect.TypeOf(arr))
  44. fmt.Println(reflect.ValueOf(arr)) // Valueof()就是取变量的值
  45. fmt.Println("")
  46. 自定义结构体 //
  47. fmt.Println("自定义结构体")
  48. // 自定义结构体
  49. user1 := User{}
  50. fmt.Println(reflect.TypeOf(user1))
  51. fmt.Println(reflect.ValueOf(user1))
  52. // 根据类型new一个结构体, 步骤如下
  53. // 1. 得到类型reflect.Type
  54. // 2. 根据类型new一个reflect.Value,再转为Interface
  55. // 3. Interface转为相应的对象指针
  56. userTy := reflect.TypeOf(user1)
  57. newInterface := reflect.New(userTy).Interface()
  58. newUser := newInterface.(*User)
  59. newUser.ID = 123
  60. newUser.Name = "123"
  61. fmt.Printf("根据reflect.Type新建的User对象内容:%v", newUser)
  62. // 自定义结构体的函数
  63. fmt.Println(reflect.TypeOf(user1).MethodByName("GetName")) // 返回该函数的形式
  64. fmt.Println(reflect.ValueOf(user1).MethodByName("GetName")) // 返回该函数在内存中的真实地址
  65. fmt.Println("")
  66. 接口 //
  67. fmt.Println("自定义结构体")
  68. man := Man{}
  69. fmt.Println(reflect.TypeOf(man)) // 返回该结构体定义的名字
  70. fmt.Println(reflect.ValueOf(man)) // 返回{}
  71. fmt.Println("")
  72. // 根据类型新建一个Woman对象
  73. womanTy := reflect.TypeOf(Woman{}) // 这里是根据一个空的Woman对象,得到其类型
  74. newWomanInterface := reflect.New(womanTy).Interface()
  75. newWoman := newWomanInterface.(*Woman)
  76. fmt.Printf("根据reflect.Type新建的newWoman对象内容:%v", newWoman)
  77. fmt.Println("")
  78. }

 

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

闽ICP备14008679号