周五在向前辈请教go-micro整合beego的契机时,遇到一个入参空接口的函数,并且一直追踪下去也是传入空接口的不知道应该传什么类型的问题,关键代码
hd := srv.NewHandler(router)
if err := srv.Handle(hd); err != nil {
log.Fatalln(err)
}
type Server interface {
// Initialise options
Init(...Option) error
// Retrieve the options
Options() Options
// Register a handler
Handle(Handler) error
// Create a new handler
NewHandler(interface{}, ...HandlerOption) Handler
// Create a new subscriber
NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber
// Register a subscriber
Subscribe(Subscriber) error
// Start the server
Start() error
// Stop the server
Stop() error
// Server implementation
String() string
}
其中http的实现
func (h *httpServer) NewHandler(handler interface{}, opts ...server.HandlerOption) server.Handler { ...}
最终是指向了结构体
type httpHandler struct {
opts server.HandlerOptions
eps []*registry.Endpoint
hd interface{}
}
然后当前结构体的get方法其中之一
func (h *httpHandler) Handler() interface{} {
return h.hd
}
返回的是
然后接着返回到第二行代码查看其他接口的实现比如 start()的http实现
func (h *httpServer) Start() error {
h.Lock()
opts := h.opts
hd := h.hd
h.Unlock()
var (
ln net.Listener
err error
)
if opts.TLSConfig != nil {
ln, err = tls.Listen("tcp", opts.Address, opts.TLSConfig)
} else {
ln, err = net.Listen("tcp", opts.Address)
}
if err != nil {
return err
}
log.Infof("Listening on %s", ln.Addr().String())
h.Lock()
h.opts.Address = ln.Addr().String()
h.Unlock()
handler, ok := hd.Handler().(http.Handler)
if !ok {
return errors.New("Server required http.Handler")
}
...
其中获取到接口类型的handler, ok := hd.Handler().(http.Handler)
之后是将
hd.Handler() 强转为http.Handler类型,这样就获得了实现http的接口中,hd := srv.NewHandler(router)
的入参类型是要满足 src 下net包中http包的Handler类型
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
感谢前辈的指导 !