golang 代理实现

编程入门 行业动态 更新时间:2024-10-17 21:28:23

<a href=https://www.elefans.com/category/jswz/34/1769831.html style=golang 代理实现"/>

golang 代理实现

 拦截接口

#invocation_handler.gopackage reflectype InvocationHandler interface {Invoke(proxy *Proxy, method *Method, args []interface{}) ([]interface{}, error)
}

代理

#proxy.gopackage reflecimport ("reflect""fmt""errors"
)type Proxy struct {target  interface{}methods map[string]*Methodhandle  InvocationHandler
}func New(target interface{}, h InvocationHandler) *Proxy {typ := reflect.TypeOf(target)value := reflect.ValueOf(target)methods := make(map[string]*Method, 0)for i := 0; i < value.NumMethod(); i++ {method := value.Method(i)methods[typ.Method(i).Name] = &Method{value:method}}return &Proxy{target:target, methods:methods, handle:h}
}func (p *Proxy)InvokeMethod(name string, args ...interface{}) ([]interface{}, error) {return p.handle.Invoke(p, p.methods[name], args)
}type Method struct {value reflect.Value
}func (m *Method)Invoke(args ...interface{}) (res []interface{}, err error){defer func() {if p := recover(); p != nil {err = errors.New(fmt.Sprintf("%s", p))}}()params := make([]reflect.Value, 0)if args != nil {for i := 0; i < len(args); i++ {params = append(params, reflect.ValueOf(args[i]))}}res = make([]interface{}, 0)r := m.value.Call(params)if r != nil && len(r) > 0{for i := 0; i < len(r); i++ {res = append(res, r[i].Interface())}}return
}

测试 

#main.gopackage mainimport (_ "mmonitor/routers""fmt""mmonitor/reflec"
)func main() {p := &Person{}h := new(PersonProxy)proxy := reflec.New(p,h)r ,_:= proxy.InvokeMethod("ReflectCallFuncNoArgs", 20, "sssssss")fmt.Println(r...)_, err := proxy.InvokeMethod("ReflectCallFuncNoArgs", 20, 323)fmt.Println(err)
}type Person struct {}func (p *Person)ReflectCallFuncNoArgs(num int, num1 string) string {fmt.Println(num)fmt.Println(num1)return fmt.Sprintf("%d,%s", num, num1)
}type PersonProxy struct {}func (p *PersonProxy)Invoke(proxy *reflec.Proxy, method *reflec.Method, args []interface{})([]interface{}, error){fmt.Println("begin")r , err:= method.Invoke(args...)fmt.Println("end")return r, err
}

结果

 

更多推荐

golang 代理实现

本文发布于:2024-02-06 02:37:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1745648.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:golang

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!