GO语言学习笔记7——反射

反射

  • 反射:可以在运行时动态获取变量的相关信息
    • Import (“reflect”)
      • reflect.TypeOf(),获取变量的类型,返回reflect.Type类型
      • reflect.ValueOf(),获取变量的值,返回reflect.Value类型
      • reflect.Value.Kind(),获取变量的类别,返回一个常量
      • reflect.Value.Interface(),转换成interface{}类型
  • 例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package main
    import (
    "fmt"
    "reflect"
    )
    type Student struct {
    Name string
    Age int
    Score float32
    }
    func test(b interface{}) {
    t := reflect.TypeOf(b)
    fmt.Println(t)
    v := reflect.ValueOf(b)
    k := v.Kind()
    fmt.Println(k)
    iv := v.Interface()
    stu, ok := iv.(Student)
    if ok {
    fmt.Printf("%v %T\n", stu, stu)
    }
    }
    func testInt(b interface{}) {
    val := reflect.ValueOf(b)
    val.Elem().SetInt(100)
    c := val.Elem().Int()
    fmt.Printf("get value interface{} %d\n", c)
    fmt.Printf("string val:%d\n", val.Elem().Int())
    }
    func main() {
    var a Student = Student{
    Name: "stu01",
    Age: 18,
    Score: 92,
    }
    test(a)
    var b int = 1
    b = 200
    testInt(&b)
    fmt.Println(b)
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    package main
    import (
    "fmt"
    "reflect"
    )
    func main() {
    var x float64 = 3.4
    fmt.Println("type:", reflect.TypeOf(x))
    v := reflect.ValueOf(x)
    fmt.Println("value:", v)
    fmt.Println("type:", v.Type())
    fmt.Println("kind:", v.Kind())
    fmt.Println("value:", v.Float())
    fmt.Println(v.Interface())
    fmt.Printf("value is %5.2e\n", v.Interface())
    y := v.Interface().(float64)
    fmt.Println(y)
    }
  • 获取变量的值

    • reflect.ValueOf(x).Float()
    • reflect.ValueOf(x).Int()
    • reflect.ValueOf(x).String()
    • reflect.ValueOf(x).Bool()
  • 通过反射的来改变变量的值

    • reflect.Value.SetXX相关方法,比如:

      • reflect.Value.SetFloat(),设置浮点数
      • reflect.Value.SetInt(),设置整数
      • reflect.Value.SetString(),设置字符串
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      package main
      import (
      "fmt"
      "reflect"
      )
      func main() {
      var a float64
      fv := reflect.ValueOf(a)
      fv.SetFloat(3.3)
      fmt.Printf("%v\n", a)
      }
      //会panic
    • 实际应该是指针才能修改a值类型

      • ValueOf(a) 传进去的是一个a的拷贝,所以改变不了值
      • 应该使用Elem()
        • 相当于获取指针来指向变量
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      package main
      import (
      "fmt"
      "reflect"
      )
      func main() {
      var a float64
      fv := reflect.ValueOf(&a)
      fv.Elem().SetFloat(3.3)
      fmt.Printf("%v\n", a)
      }
      //OK

本文标题:GO语言学习笔记7——反射

文章作者:Yang Shuai

发布时间:2019年06月10日 - 19:06

最后更新:2019年06月10日 - 19:06

原始链接:https://ysbbswork.github.io/2019/06/10/GO语言学习笔记7——反射/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!