创建一个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 引擎。