创建一个net.Listener实现,通过在通道上接收来接受连接:
type listener struct {
ch chan net.Conn
addr net.Addr
}
// newListener creates a channel listener. The addr argument
// is the listener's network address.
func newListener(addr net.Addr) *listener {
return &listener{
ch: make(chan net.Conn),
addr: addr,
}
}
func (l *listener) Accept() (net.Conn, error) {
c, ok := <-l.ch
if !ok {
return nil, errors.New("closed")
}
return c, nil
}
func (l *listener) Close() error { return nil }
func (l *listener) Addr() net.Addr { return l.addr }
通过发送到通道来处理连接:
func (l *listener) Handle(c net.Conn) error {
l.ch <- c
return nil
}
以下是如何将它们联系在一起:
创建监听器:
s := newListener(someAddr)
像往常一样配置 Gin 引擎。
router := gin.New()
router.GET(...)
router.POST(...)
使用通道监听器和 Gin 引擎在 goroutine 中运行 net/http 服务器:
err := http.Serve(s, router)
if err != nil {
// handle error
}
在您的调度代码中,调用 将s.Handle(c)连接传递到 net/http 服务器,然后传递到 Gin 引擎。