ddsdjn 发表于 2018-9-20 08:16:02

Golang的interface一个例子

  我们用Golang做网站时,必然会有这样的代码:
  http.Handle("/", http.FileServer(http.Dir(".")))
  注意这里的 http.Handle( 函数的第二个参数,Golang的源码中这个函数的描述如下:
  // Handle registers the handler for the given pattern
  // in the DefaultServeMux.
  // The documentation for ServeMux explains how patterns are matched.
  func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
  其中第二个参数是一个 interface,必须实现ServeHTTP(ResponseWriter, *Request)方法
  // Objects implementing the Handler interface can be
  // registered to serve a particular path or subtree
  // in the HTTP server.
  //
  // ServeHTTP should write reply headers and data to the ResponseWriter
  // and then return.  Returning signals that the request is finished
  // and that the HTTP server can move on to the next request on
  // the connection.
  type Handler interface {
  ServeHTTP(ResponseWriter, *Request)
  }
  如果我们用WebSocket时,又会发现, 我们给http.Handle( 传递的是 websocket.Handler(。
  http.Handle("/socket", websocket.Handler(Echo))
  websocket.Handler 又是另外一个接口,如下
  // Handler is an interface to a WebSocket.
  type Handler func(*Conn)
  这里为啥会出现接口更换了? 其实 再往下看可以看到 websocket.Handler 接口多一个公共的方法:ServeHTTP, 即接口 websocket.Handler 实现了 http 的 Handler 接口。
  // ServeHTTP implements the http.Handler interface for a Web Socket
  func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
这里的interface有了其他语言类的一些特征,比较有趣。  // Handler is an interface to a WebSocket.type Handler func(*Conn)
  // ServeHTTP implements the http.Handler interface for a Web Socketfunc (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) {

页: [1]
查看完整版本: Golang的interface一个例子