记录一个代码追踪问题srv.NewHandler(router)

周五在向前辈请教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
}

返回的是

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

感谢前辈的指导 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值