继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Go(6 [反射])

holdtom
关注TA
已关注
手记 1703
粉丝 240
获赞 991


反射:可以在运行时动态获取变量的相关信息

reflect.TypeOf,获取变量的类型,返回reflect.Type类型

reflect.ValueOf,获取变量的值,返回reflect.Value类型

reflect.Value.Kind,获取变量的类别,返回一个常量

reflect.Value.Interface(),转换成interface{}类型

修改变量的值

类型检查代码

func getTypeInfo(a interface{}) {

    typeInfo := reflect.TypeOf(a)

    kind := typeInfo.Kind()

    fmt.Println("kind of a:", kind)

    //NumMethod :获取当前变量a 有多少个方法

    num := typeInfo.NumMethod()

    fmt.Println("method num:", num)

    //MethodByName:通过名字获取方法的定义

    method, ok := typeInfo.MethodByName("SetName")

    if !ok {

        fmt.Println("not have method SetName")

    } else {

        fmt.Println(method)

    }

    fmt.Println()

    fmt.Println()

}

func getAllMethod(a interface{}) {

    typeInfo := reflect.TypeOf(a)

    //NumMethod:获取变量实现方法的个数

    num := typeInfo.NumMethod()

    for i := 0;i <num; i++{

        method := typeInfo.Method(i)

        fmt.Println(method)

    }

}

func testGetTypeInfo() {

    var i int

    getTypeInfo(i)

    var stu Student

    getTypeInfo(&stu)

    var s [5]int

    getTypeInfo(s)

}

func testGetAllMethod() {

    

    var stu Student

    getAllMethod(&stu)

}

func testGetValuInfo() {

    var i int = 100

    //获取值相关信息,返回一个结构体

    valueInfo := reflect.ValueOf(&i)

    

        //因为修改值,需要传递指针,所以呢,使用反射中的 Elem 方法,就是用来修改传递指针

    valueInfo.Elem().SetInt(200)

    tmp := valueInfo.Interface()

    val := tmp.(*int)

    fmt.Println("val:", val)

    fmt.Println("val of valueInfo:", valueInfo.Elem().Int())

    fmt.Println("type:", valueInfo.Type())

    fmt.Println("kind:", valueInfo.Kind())

    fmt.Println("i=", i)

    var stu Student

    valueInfo = reflect.ValueOf(stu)

    fmt.Println("type:", valueInfo.Type())

    fmt.Println("kind:", valueInfo.Kind())

}

操作结构体

reflect.Value.NumField()获取结构体中字段的个数

reflect.Value.Method(n).Call来调⽤结构体中的⽅法

package main

import (

    "fmt"

    "reflect"

)

type Student struct {

    Name string

    Age int

    Sex int

}

func (s *Student) Set(name string , Age int, Sex int) {

    s.Name = name

    s.Age = Age

    s.Sex = Sex

}

func (s *Student) GetName(name string) {

    s.Name = name

}

func testStruct () {

    var stu *Student = &Student{}

    stu.Set("jim", 18, 1)

    valueInfo := reflect.ValueOf(stu)

    fieldNum := valueInfo.Elem().NumField()

    fmt.Println("field name:", fieldNum)

    sexValueInfo := valueInfo.Elem().FieldByName("Sex")

    fmt.Println("sex=", sexValueInfo.Int())

    sexValueInfo.SetInt(100)

    fmt.Println(stu)

    setMethod := valueInfo.MethodByName("Set")

    fmt.Println(setMethod)

    

    var params []reflect.Value

    name := "Tom"

    age := 1000

    sex := 3883

    params = append(params, reflect.ValueOf(name))

    params = append(params, reflect.ValueOf(age))

    params = append(params, reflect.ValueOf(sex))

    setMethod.Call(params)

    fmt.Println(stu)

}

func main() {

    testStruct()

}

©著作权归作者所有:来自51CTO博客作者zhaichaoqun的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP