反射
在reflect包中,主要通过Typeof()和Valueof()两个方法来实现反射。两个方法相互结合,能够反射出被反射函数的全部信息。
/**
* Createby GoLand
* User xzw jsjxzw@163.com
* Date 2021/7/1
* Time 下午6:02
*/
package main
import (
"fmt"
"reflect"
)
type Ref struct {
id int
name string
}
func (ref *Ref) GetName() {
fmt.Println("getName()函数")
}
func (ref *Ref) GetNameById() {
fmt.Println("getNameById()函数")
}
func main() {
ref := new(Ref)
t := reflect.TypeOf(ref)
v := reflect.ValueOf(ref)
fmt.Println(t)
fmt.Println(v)
for i := 0; i < t.NumMethod(); i++ {
fmt.Println(t.Method(i).Name)
v.Method(i).Call(nil)
}
}
反射的实现过程
由于有反射的存在,因此在传统的MVC的设计模式中,当我们添加服务时,不需要修改Controller端的代码,Controller只需要维持一个map的表,里面的就来存储需要被反射的models。
/**
* Createby GoLand
* User xzw jsjxzw@163.com
* Date 2021/7/1
* Time 下午6:08
*/
package server
import (
"fmt"
"reflect"
)
type ReServer struct {
M map[string]interface{}
}
// RegisterService 注册服务
func (this *ReServer) RegisterService(service interface{}) {
serviceType := reflect.TypeOf(service).Elem()
ServiceName := serviceType.Name()
if _, ok := this.M[ServiceName]; ok {
fmt.Println("service has been registered")
} else {
this.M[ServiceName] = service
}
}
// Start 服务启动
// c 控制器名
// m 方法名
func (this *ReServer) Start(c, m string) {
for k, v := range this.M {
// 里面根据业务逻辑执行想要的方法
if k == c {
v := reflect.ValueOf(v)
v.MethodByName(m).Call(nil)
}
}
}
/**
* Createby GoLand
* User xzw jsjxzw@163.com
* Date 2021/7/1
* Time 下午6:12
*/
package main
import (
"imooc.com/ccmouse/learngo/reflect/2/group"
"imooc.com/ccmouse/learngo/reflect/2/server"
"imooc.com/ccmouse/learngo/reflect/2/user"
)
func main() {
reServer := &server.ReServer{
M: make(map[string]interface{}),
}
user := &user.User{
Id: 1,
Name: "XZW",
Age: 20,
}
reServer.RegisterService(user)
group := &group.Group{
Id: 121,
Name: "developer",
Pid: 0,
}
reServer.RegisterService(group)
reServer.Start("Group", "Test")
}
/**
* Createby GoLand
* User xzw jsjxzw@163.com
* Date 2021/7/1
* Time 下午6:16
*/
package user
import "fmt"
type User struct {
Id int
Name string
Age int
}
func (user *User) FunOne() {
fmt.Printf("user name %v,id %v,age %v", user.Name, user.Id, user.Age)
}
/**
* Createby GoLand
* User xzw jsjxzw@163.com
* Date 2021/7/1
* Time 下午6:28
*/
package group
import "fmt"
type Group struct {
Id int
Name string
Pid int
}
func (group Group) Test() {
fmt.Printf("group name %v,id %v ,pid %v", group.Name, group.Id, group.Pid)
}