美文网首页Golang语言社区
Go语言接口和方法

Go语言接口和方法

作者: 丶沙工 | 来源:发表于2016-07-03 20:26 被阅读79次

因为几乎任何东西都可加以方法,几乎任何东西都可满足某界面。一个展示的例子是 http 包定义的 Handler 界面。任何物件实现了Handler 都可服务 HTTP 请求。

  type Handler interface {
      ServeHTTP(*Conn, *Request)
  }

ResponseWriter 本身是个界面,它提供一些可访问的方法来返回客户的请求。这些方法包括标准的 Write 方法。因此 http.ResponseWriter 可用在 io.Writer 可以使用的地方。Request 是个结构,包含客户请求的一个解析过的表示。

为求简短,我们忽略 POST 并假定所有 HTTP 请求都是 GET;此简化不会影响经手者的设置。下面一个小而全的经手者实现了网页访问次数的计数。

// Simple counter server.
  type Counter struct {
      n int
  }
  
  func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
      ctr.n++
      fmt.Fprintf(c, "counter = %d\n", ctr.n)
  }

(注意 Fprintf 怎样打印到 http.ResponseWriter)。作为参考,这里是怎样把服务者加在一个 URL 树的节点上。

 import "http"
  ...
  ctr := new(Counter)
  http.Handle("/counter", ctr)

可是为何把 Counter 作为结构呢?一个整数能够了。(接受者需是指针,使增量带回调用者)。

// Simpler counter server.
  type Counter int
  
  func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
      *ctr++
      fmt.Fprintf(c, "counter = %d\n", *ctr)
  }

当某页被访问时怎样通知你的程序更新某些内部状态呢?给网页贴个信道。

// A channel that sends a notification on each visit.
  // (Probably want the channel to be buffered.)
  type Chan chan *http.Request
  
  func (ch Chan) ServeHTTP(c *http.Conn, req *http.Request) {
      ch <- req
      fmt.Fprint(c, "notification sent")
  }

最后,让我们在 /args 显示启动服务器时的参量。写个打印参量的函数很容易:

  func ArgServer() {
      for i, s := range os.Args {
          fmt.Println(s)
      }
  }

怎样把它变成 HTTP 服务器呢?我们可以把 ArgServer 作为某个类型的方法再忽略其值,也有更干净的做法。既然我们可以给任意非指针和界面的类型定义方法,我们可以给函数写个方法。http 包里有如下代码:

 // The HandlerFunc type is an adapter to allow the use of
  // ordinary functions as HTTP handlers.  If f is a function
  // with the appropriate signature, HandlerFunc(f) is a
  // Handler object that calls f.
  type HandlerFunc func(*Conn, *Request)
  
  // ServeHTTP calls f(c, req).
  func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) {
      f(c, req)
  }

HandlerFunc 是个带 ServeHTTP 方法的类型, 所以此类的值都可以服务 HTTP 请求。我们来看看此方法的实现:接受者是个函数,f,方法调用 f 。看起来很怪,但和,比如,接受者是信道,而方法发送到 此信道,没什么不同。

要把 ArgServer 变为 HTTP 服务器, 我们首先改成正确的签名:

 // Argument server.
  func ArgServer(c *http.Conn, req *http.Request) {
      for i, s := range os.Args {
          fmt.Fprintln(c, s)
      }
  }

ArgServer 现在和 HandlerFunc 有同样的签名,就可以转成此类使用其方法,就像我们把 Sequence 转为 IntArray 来使用 IntArray.Sort 一样。设置代码很简短:

http.Handle("/args", http.HandlerFunc(ArgServer))

当有人访问 /args 页时,此页的经手者有值 ArgServer 和类型HandlerFunc。HTTP 服务器启动此类型的 ServeHTTP 方法,用ArgServer 作为接受者,反过来调用 ArgServer (通过启动handlerFunc.ServeHTTP 的 f(w, req) 。)参量被显示出来。

此节中我们从一个结构,整数,信道和一个函数制造出一个 HTTP 服务器,全赖于界面就是一套方法,可定义在(几乎)任何类型上。

相关文章

  • Go语言方法和接口

    定义一个结构体,将函数和结构体绑定在一起的东西就是方法 格式:func (接收者名称 接收者类型)函数名称(形参列...

  • Go语言接口和方法

    因为几乎任何东西都可加以方法,几乎任何东西都可满足某界面。一个展示的例子是 http 包定义的 Handler 界...

  • Learning Go(1)

    Go是面向接口和函数式编程的语言; Go只有值类型和指针类型 在写可调用方法时,方法名要大写; “=”和“:...

  • 【Golang 基础】Go 语言的接口

    Go 语言中的接口   Go 语言中的接口就是方法签名的集合,接口只有声明,没有实现,没有数据字段。 只要某个类型...

  • Golang学习笔记-接口和错误

    接口 Go接口定义了方法后,其它类型只要实现了这些方法就是实现了接口。Go语言中接口类型的独特之处在于它是满足隐式...

  • go语言基础

    go语言基础 go 语言接口

  • 《Go语言四十二章经》第十九章 接口

    《Go语言四十二章经》第十九章 接口 作者:李骁 19.1 接口是什么 Go 语言接口定义了一组方法集合,但是这些...

  • go接口与反射

    go语言的interface是个很松散的概念,类型不必明确声明实现了接口,go语言通过内部维护一个实现此接口方法的...

  • Golang 学习笔记七 接口

    一、概念 《快学 Go 语言》第 9 课 —— 接口 1.接口定义Go 语言的接口类型非常特别,它的作用和 Jav...

  • golang-接口

    Go语言规定,只要实现了接口里面的方法,就是该接口的实现类 定义一个接口 接口实现1 接口实现 2 main方法

网友评论

    本文标题:Go语言接口和方法

    本文链接:https://www.haomeiwen.com/subject/zdkcjttx.html