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也是通过反射实现的。