为了账号安全,请及时绑定邮箱和手机立即绑定

Go(6 [反射])

标签:
Go


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

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的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消