反射

在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)
}

Scroll to Top