1. package main
    2. import (
    3. "encoding/json"
    4. "fmt"
    5. )
    6. type Student struct {
    7. ID int `json:"id"`
    8. Gender string `json:"gender"`
    9. Name string `json:"name"`
    10. Sno string `json:"sno"`
    11. }
    12. func main() {
    13. var s1 = Student{
    14. ID: 1,
    15. Gender: "男",
    16. Name: "李四",
    17. Sno: "s0001",
    18. }
    19. fmt.Println("aa")
    20. var s, _ = json.Marshal(s1)
    21. jsonStr := string(s)
    22. fmt.Println(jsonStr)
    23. }
    1. package main
    2. import (
    3. "fmt"
    4. "reflect"
    5. )
    6. type myInt int
    7. type Person struct {
    8. Name string
    9. Age int
    10. }
    11. //反射获取任意变量的类型
    12. func reflectFn(x interface{}) {
    13. v := reflect.TypeOf(x)
    14. fmt.Println(v)
    15. }
    16. func main() {
    17. a := 10 //int
    18. b := 23.4 //float64
    19. c := true //bool
    20. d := "你好golang" //string
    21. reflectFn(a)
    22. reflectFn(b)
    23. reflectFn(c)
    24. reflectFn(d)
    25. var e myInt = 34
    26. var f = Person{
    27. Name: "张三",
    28. Age: 20,
    29. }
    30. reflectFn(e) //main.myInt
    31. reflectFn(f) //main.Person
    32. var h = 25
    33. reflectFn(&h) //*int
    34. }
    1. package main
    2. import (
    3. "fmt"
    4. "reflect"
    5. )
    6. type myInt int
    7. type Person struct {
    8. Name string
    9. Age int
    10. }
    11. //反射获取任意变量的类型
    12. func reflectFn(x interface{}) {
    13. v := reflect.TypeOf(x)
    14. // v.Name() //类型名称 ,种类(Kind)就是指底层的类型
    15. // v.Kind() //种类
    16. fmt.Printf("类型:%v 类型名称:%v 类型种类:%v \n", v, v.Name(), v.Kind())
    17. }
    18. func main() {
    19. a := 10 //int
    20. b := 23.4 //float64
    21. c := true //bool
    22. d := "你好golang" //string
    23. reflectFn(a)
    24. reflectFn(b)
    25. reflectFn(c)
    26. reflectFn(d)
    27. var e myInt = 34
    28. var f = Person{
    29. Name: "张三",
    30. Age: 20,
    31. }
    32. reflectFn(e) //main.myInt
    33. reflectFn(f) //main.Person
    34. var h = 25
    35. reflectFn(&h) //*int 类型名称: 类型种类:ptr
    36. var i = [3]int{1, 2, 3}
    37. reflectFn(i) //[3]int 类型名称: 类型种类:array
    38. var j = []int{11, 22, 33}
    39. reflectFn(j) //[]int 类型名称: 类型种类:slice
    40. }
    1. package main
    2. import (
    3. "fmt"
    4. "reflect"
    5. )
    6. func reflectValue(x interface{}) {
    7. // var num = 10 + x //(mismatched types int and interface {}
    8. // b, _ := x.(int)
    9. // var num = 10 + b
    10. // fmt.Println(num) //23
    11. //反射来实现这个功能
    12. // v := reflect.ValueOf(x)
    13. // fmt.Println(v) //13
    14. // var n = v + 12
    15. // fmt.Println(n) //mismatched types reflect.Value and int
    16. //反射获取变量的原始值
    17. v := reflect.ValueOf(x)
    18. var m = v.Int() + 12
    19. fmt.Println(m) //25
    20. }
    21. func main() {
    22. var a = 13
    23. reflectValue(a)
    24. }
    1. package main
    2. import (
    3. "fmt"
    4. "reflect"
    5. )
    6. func reflectValue(x interface{}) {
    7. v := reflect.ValueOf(x)
    8. // v.Kind() //获取种类
    9. kind := v.Kind()
    10. switch kind {
    11. case reflect.Int64:
    12. fmt.Printf("int类型的原始值%v,计算后的值是%v \n", v.Int(), v.Int()+10)
    13. case reflect.Float32:
    14. fmt.Printf("Float32类型的原始值%v\n", v.Float())
    15. case reflect.Float64:
    16. fmt.Printf("Float64类型的原始值%v\n", v.Float())
    17. case reflect.String:
    18. fmt.Printf("string类型的原始值%v\n", v.String())
    19. default:
    20. fmt.Printf("还没有判断这个类型\n")
    21. }
    22. }
    23. func main() {
    24. var a int64 = 100
    25. var b float32 = 12.3
    26. var c string = "你好golang"
    27. reflectValue(a)
    28. reflectValue(b)
    29. reflectValue(c)
    30. }
    1. package main
    2. import (
    3. "fmt"
    4. "reflect"
    5. )
    6. func reflectSetValue(x interface{}) {
    7. // *x = 120 //invalid indirect of x (type interface {})
    8. // v, _ := x.(*int)
    9. // *v = 120 // invalid memory address or nil pointer dereferenc
    10. v := reflect.ValueOf(x)
    11. // fmt.Println(v.Kind()) //ptr
    12. // fmt.Println(v.Elem().Kind()) //int64
    13. if v.Elem().Kind() == reflect.Int64 {
    14. v.Elem().SetInt(123)
    15. } else if v.Elem().Kind() == reflect.String {
    16. v.Elem().SetString("你好 go语言")
    17. }
    18. }
    19. func main() {
    20. var a int64 = 100
    21. reflectSetValue(&a)
    22. fmt.Println(a)
    23. var b string = "你好golang"
    24. reflectSetValue(&b)
    25. fmt.Println(b)
    26. }
    1. package main
    2. import (
    3. "fmt"
    4. "reflect"
    5. )
    6. //student结构体
    7. type Student struct {
    8. Name string `json:"name1" form:"username"`
    9. Age int `json:"age"`
    10. Score int `json:"score"`
    11. }
    12. func (s Student) GetInfo() string {
    13. var str = fmt.Sprintf("姓名:%v 年龄:%v 成绩:%v", s.Name, s.Age, s.Score)
    14. return str
    15. }
    16. func (s *Student) SetInfo(name string, age int, score int) {
    17. s.Name = name
    18. s.Age = age
    19. s.Score = score
    20. }
    21. func (s Student) Print() {
    22. fmt.Println("这是一个打印方法...")
    23. }
    24. //打印字段
    25. func PrintStructField(s interface{}) {
    26. //判断参数是不是结构体类型
    27. t := reflect.TypeOf(s)
    28. v := reflect.ValueOf(s)
    29. if t.Kind() != reflect.Struct && t.Elem().Kind() != reflect.Struct {
    30. fmt.Println("传入的参数不是一个结构体")
    31. return
    32. }
    33. //1、通过类型变量里面的Field可以获取结构体的字段
    34. field0 := t.Field(0)
    35. fmt.Printf("%#v \n", field0) //reflect.StructField{Name:"Name", PkgPath:"", Type:(*reflect.rtype)(0x4adf20), Tag:"json:\"name\"", Offset:0x0, Index:[]int{0}, Anonymous:false}
    36. fmt.Println("字段名称:", field0.Name)
    37. fmt.Println("字段类型:", field0.Type)
    38. fmt.Println("字段Tag:", field0.Tag.Get("json"))
    39. fmt.Println("字段Tag:", field0.Tag.Get("form"))
    40. //2、通过类型变量里面的FieldByName可以获取结构体的字段
    41. fmt.Println("----------------------")
    42. field1, ok := t.FieldByName("Age")
    43. if ok {
    44. fmt.Println("字段名称:", field1.Name)
    45. fmt.Println("字段类型:", field1.Type)
    46. fmt.Println("字段Tag:", field1.Tag.Get("json"))
    47. }
    48. //3、通过类型变量里面的NumField获取到该结构体有几个字段
    49. var fieldCount = t.NumField()
    50. fmt.Println("结构体有", fieldCount, "个属性")
    51. //4、通过值变量获取结构体属性对应的值
    52. fmt.Println(v.FieldByName("Name"))
    53. fmt.Println(v.FieldByName("Age"))
    54. fmt.Println("----------------------")
    55. for i := 0; i < fieldCount; i++ {
    56. fmt.Printf("属性名称:%v 属性值:%v 属性类型:%v 属性Tag:%v\n", t.Field(i).Name, v.Field(i), t.Field(i).Type, t.Field(i).Tag.Get("json"))
    57. }
    58. }
    59. //打印执行方法
    60. func PrintStructFn(s interface{}) {
    61. t := reflect.TypeOf(s)
    62. v := reflect.ValueOf(s)
    63. if t.Kind() != reflect.Struct && t.Elem().Kind() != reflect.Struct {
    64. fmt.Println("传入的参数不是一个结构体")
    65. return
    66. }
    67. //1、通过类型变量里面的Method可以获取结构体的方法
    68. method0 := t.Method(0) //和结构体方法的顺序没有关系,和结构体方法的ASCII有关系
    69. fmt.Println(method0.Name) //GetInfo
    70. fmt.Println(method0.Type) //func(main.Student) string
    71. fmt.Println("--------------------------")
    72. //2、通过类型变量获取这个结构体有多少个方法
    73. method1, ok := t.MethodByName("Print")
    74. if ok {
    75. fmt.Println(method1.Name) //Print
    76. fmt.Println(method1.Type) //func(main.Student)
    77. }
    78. fmt.Println("--------------------------")
    79. //3、通过《值变量》执行方法 (注意需要使用值变量,并且要注意参数) v.Method(0).Call(nil) 或者v.MethodByName("Print").Call(nil)
    80. // v.Method(1).Call(nil)
    81. v.MethodByName("Print").Call(nil)
    82. info1 := v.MethodByName("GetInfo").Call(nil)
    83. fmt.Println(info1)
    84. //4、执行方法传入参数 (注意需要使用《值变量》,并且要注意参数,接收的参数是[]reflect.Value的切片)
    85. var params []reflect.Value
    86. params = append(params, reflect.ValueOf("李四"))
    87. params = append(params, reflect.ValueOf(23))
    88. params = append(params, reflect.ValueOf(99))
    89. v.MethodByName("SetInfo").Call(params) //执行方法传入参数
    90. info2 := v.MethodByName("GetInfo").Call(nil)
    91. fmt.Println(info2)
    92. // 5、获取方法数量
    93. fmt.Println("方法数量:", t.NumMethod())
    94. }
    95. func main() {
    96. stu1 := Student{
    97. Name: "小明",
    98. Age: 15,
    99. Score: 98,
    100. }
    101. // PrintStructField(stu1)
    102. PrintStructFn(&stu1)
    103. fmt.Printf("%#v\n", stu1)
    104. }
    1. package main
    2. import (
    3. "fmt"
    4. "reflect"
    5. )
    6. //student结构体
    7. type Student struct {
    8. Name string `json:"name"`
    9. Age int `json:"age"`
    10. Score int `json:"score"`
    11. }
    12. func (s Student) GetInfo() string {
    13. var str = fmt.Sprintf("姓名:%v 年龄:%v 成绩:%v", s.Name, s.Age, s.Score)
    14. return str
    15. }
    16. //反射修改结构体属性
    17. func reflectChangeStruct(s interface{}) {
    18. t := reflect.TypeOf(s)
    19. v := reflect.ValueOf(s)
    20. if t.Kind() != reflect.Ptr {
    21. fmt.Println("传入的不是结构体指针类型")
    22. return
    23. } else if t.Elem().Kind() != reflect.Struct {
    24. fmt.Println("传入的不是结构体指针类型")
    25. return
    26. }
    27. //修改结构体属性的值
    28. name := v.Elem().FieldByName("Name")
    29. name.SetString("小李")
    30. age := v.Elem().FieldByName("Age")
    31. age.SetInt(22)
    32. }
    33. func main() {
    34. stu1 := Student{
    35. Name: "小明",
    36. Age: 15,
    37. Score: 98,
    38. }
    39. // PrintStructField(stu1)
    40. reflectChangeStruct(&stu1)
    41. fmt.Printf("%#v\n", stu1) //main.Student{Name:"小李", Age:22, Score:98}
    42. }