go-反射

Posted osbreak

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go-反射相关的知识,希望对你有一定的参考价值。

 

package main

import (
    "fmt"
    "reflect"
)

type Student struct {
    name string
    age  int
}

func (s Student) Set(name string, age int) {
    s.name = name
    s.age = age
}

func test(b interface{}) {

    val := reflect.ValueOf(b)
    kd := val.Kind()
    //判断是否为结构体

    switch kd {
    case reflect.Struct:
        {
            t := reflect.TypeOf(b)
            fmt.Println(t)

            //获取值
            value := reflect.ValueOf(b)

            //获取值类型
            ty := value.Interface()
            //转化为实际类型
            ss, ok := ty.(Student)
            if ok {
                fmt.Println(ss)
            }

            //通过反射获取方法个数
            Count := value.NumMethod()
            fmt.Printf("has %d Method
", Count)
        }
    case reflect.Int:
        {
            t := reflect.TypeOf(b)
            fmt.Println(t)
        }
    }
}

func testInt(n interface{}) {
    val := reflect.ValueOf(n)
    //获取值
    c := val.Elem().Int()
    fmt.Println(c)

    //设置值
    val.Elem().SetInt(100)
    fmt.Println(val.Elem().Int())
}

func main() {
    //通过反射,获取变量信息
    s := Student{"break", 18}
    test(s)

    //通过反射,修改
    var nNum int = 10
    testInt(&nNum)
}

 

以上是关于go-反射的主要内容,如果未能解决你的问题,请参考以下文章

Go 每日一库之 reflect

Gin利用Go的反射原理进行路由注册

实战演示 Go 反射的使用方法和应用场景

Go 每日一库之 reflect

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

Go 处理yaml类型的配置文件