golang的反射机制(一)
1、通过反射操作,可以获取一个接口类型变量的类型和数值
实例:
package main
import (
"fmt"
"reflect"
)
//通过反射操作,可以获取一个接口类型变量的类型和数值
func main() {
var x int64 = 66
fmt.Println("type:", reflect.TypeOf(x)) //type: int64
fmt.Println("value:", reflect.ValueOf(x)) //value: 66
//根据反射的值,来获取对应的类型和数值
v := reflect.ValueOf(x)
fmt.Println("kind:", v.Kind()) //kind: int64
fmt.Println("type:", v.Type()) //type: int64
fmt.Println("value:", v.Int()) //value: 66
var num float64 = 1.34
//接口类型变量-->反射类型对象
value:=reflect.ValueOf(num)
//反射类型对象-->接口类型变量
convertValue:=value.Interface().(float64)
fmt.Println(convertValue) //1.34
/*
反射类型对象-->接口类型变量,理解为“强制转换”
Golang对类型要求很严格,类型一定要完全符合
一个是*float64,一个是float64,如果弄混,直接panic
*/
pointer:=reflect.ValueOf(&num)
convertPointer:=pointer.Interface().(*float64)
fmt.Println(*convertPointer) //1.34
}
2.通过反射获取对象的字段以及方法
实例:
package main
import (
"fmt"
"reflect"
)
type Person1 struct {
Name string
Age int
Sex string
}
func (p Person1) Say(msg string) {
fmt.Printf("hello,",msg)
}
func (p Person1) PrintInfo() {
fmt.Printf("姓名:%s,年龄:%d,性别:%s",p.Name,p.Age,p.Sex)
}
func main() {
p1 := Person1{"老李",30,"男"}
GetMessage(p1)
}
func GetMessage(input interface{}) {
getType:=reflect.TypeOf(input)
fmt.Println("Type:",getType.Name())
fmt.Println("Kind:",getType.Kind())
getValue:=reflect.ValueOf(input)
fmt.Println("get all fields :",getValue)
//获取字段
/*
step1:先获取Type对象:reflect.Type,
NumField()
Field(index)
step2:通过Field()获取每一个Field字段
step3:Interface().得到对应的Value
*/
for i:=0;i<getType.NumField();i++{
field:=getType.Field(i)
value:=getValue.Field(i).Interface()//
fmt.Printf("字段名称:%s,字段类型:%s,字段数值:%v\n",field.Name,field.Type,value)
}
//获取方法
for i:=0;i<getType.NumMethod();i++{
method:=getType.Method(i)
fmt.Printf("方法名称:%s,方法类型:%v\n",method.Name,method.Type)
}
}