zoukankan      html  css  js  c++  java
  • Go 接口转换的一个例子

    今天将Go 的websocket集成到已有的http中时也遇到以下一个问题:其中主要是接口类型转换

    转载自[http://www.cnblogs.com/ghj1976/archive/2013/04/23/3037914.html]


     我们用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集成到已有的http

    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)


    type websocket.Handler func(*websocket.Conn)

    Handler is a simple interface to a WebSocket browser client. It checks if Origin header is valid URL by default. You might want to verify websocket.Conn.Config().Origin in the func. If you use Server instead of Handler, you could call websocket.Origin and check the origin in your Handshake func. So, if you want to accept non-browser client, which doesn't send Origin header, you could use Server . that doesn't check origin in its Handshake.

    • method

      (websocket.Handler).ServeHTTP(w net/http.ResponseWriter, req *net/http.Request)

    ServeHTTP implements the http.Handler interface for a WebSocket

    通过以前的信息可以看出websocket.Handler实现了http.Handler接口,从而实现了接口类型的转换。
  • 相关阅读:
    面向对象之类属性、类方法,静态方法
    python面向对象之继承
    python之面向对象练习
    python面向对象
    CentOS7.5最小化安装之后的配置
    怎么在一台电脑上安装win7与centos7双系统
    安装Win7时删除系统保留的100M隐藏分区
    win7在安装时跳过输入用户名界面,直接开启管理员用户
    ESP8266 wifi干扰钓鱼实现
    ESP8266 wifi干扰、钓鱼实现
  • 原文地址:https://www.cnblogs.com/syru/p/3602750.html
Copyright © 2011-2022 走看看