当前位置: 代码迷 >> 综合 >> golang-反射reflect
  详细解决方案

golang-反射reflect

热度:55   发布时间:2023-10-13 09:13:50.0

TypeOf()

reflect.TypeOf(a)
//如果a是具体的类型变量返回具体的类型信息
//如果a是一个接口类型,且绑定具体的类型实例,返回接口的动态类型(绑定的具体实例)
//如果a是一个接口类型,没有绑定具体的类型实例,返回静态类型信息
package main
import ("fmt""reflect"
)
type A1 interface {
    
}
type INT int
func main(){
    var i A1//接口a1:=reflect.TypeOf(i)fmt.Println(a1)//nilvar i1 inta2:=reflect.TypeOf(i1)fmt.Println(a2)//inti=i1a3:=reflect.TypeOf(i)fmt.Println(a3)//intvar i2 INTa4:=reflect.TypeOf(i2)fmt.Println(a4)//INT
}

ValueOf()

reflect.ValueOf(a)//获取a的value
package mainimport ("fmt""reflect"
)func main(){
    a:=10a1:=reflect.ValueOf(a)fmt.Println(a1)//10fmt.Println(a1.Type().Name())//int
}

利用反射调用函数

package mainimport ("fmt""reflect"
)type A struct{
    
}
type B struct{
    In   []reflect.ValueOut  []reflect.ValueName string
}func f1(b *B){
    b.In = append(b.In, reflect.ValueOf("11"))}func (c *A) Invoke(b *B) {
    m := reflect.ValueOf(c).MethodByName(b.Name)//根据方法名找方法fmt.Println(m)b.Out = m.Call(b.In)return
}
func (c *A)Abc(s string) string{
    fmt.Println(s)return s}func main(){
    b:=B{
    }var a *Aa=&A{
    }f1(&b)b.Name="Abc" //函数首字母必须大写,否则不能导出a.Invoke(&b)fmt.Println(b.Out)//[11]
}

注意:方法名首字母必须大写

使用反射调用函数时,需要将参数使用反射值对象的切片[]reflect.Value构造后传入Call()方法中,调用完成时,函数的返回值通过[]reflect.Value返回。

	In   []reflect.ValueOut  []reflect.Value...b.Out = m.Call(b.In)

利用反射调用函数的目的:
通过反射我们可以还原一个对像的属性,方法。 通俗的讲,在分布式环境下,我给你传了一个json化的数据结构,但是这数据结构被解析后对应了一个方法,这方法可以用来反射调用。 另外golang的rpc也是通过反射实现的。

  相关解决方案