学习go的反射对于理解go的底层实现以及接口机制有着非常重要的价值;本篇文章从一个源程序来体验一下go反射的两个核心函数TypeOf 和ValueOf的使用方法,特别体验下怎么根据type构造type实例的办法。
package main
import (
"fmt"
"reflect"
)
type Speaker interface {
Speak()string
Set(string)
}
type Teacher struct {
Name string
}
func (this *Teacher) Speak() string {
return this.Name
}
func (this *Teacher) Set(name string) {
this.Name = name
}
func TestRef(s Speaker)(t reflect.Type){
reflectVal := reflect.ValueOf(s)
//t = reflect.Indirect(reflectVal).Type()
t = reflectVal.Elem().Type()
fmt.Printf("reflect.ValueOf(%v).Elem().Type()=%v\n",s,t)
return
}
func TestRef2(s Speaker)(t reflect.Type){
//t = reflect.TypeOf(s).Elem()
//fmt.Printf("reflect.TypeOf(%v).Elem()=%v\n",s,t)
t = reflect.TypeOf(s)
fmt.Printf("reflect.TypeOf(%v)=%v\n",s,t)
return
}
func TestRef3