Go言語インターフェースと方法

2914 ワード

ほとんどのものは方法を加えることができますので、ほとんどのものは界面を満たすことができます.示された例は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
", ctr.n) }
(Fprintfはhttp.ResponseWriterにどのように印刷しますか?)参考として、ここはどうやってサービス者を一つのURLツリーのノードに加えるのですか?
 import "http"
  ...
  ctr := new(Counter)
  http.Handle("/counter", ctr)
しかしなぜカウンターを構造とするのですか?一つの整数でいいです.(受け入れ者はポインタを必要とし、増分を调节者に持ち帰る).
// Simpler counter server.
  type Counter int
  
  func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
      *ctr++
      fmt.Fprintf(c, "counter = %d
", *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 
最後に、サーバーを起動する際のパラメータを/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)
  }
HandlerFunは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は現在HandlerFncと同じ署名を持っています.このような使い方に変えられます.私たちがSequenceをIntArayに変えてIntAray.Sortを使うように.設定コードが短い:
http.Handle("/args", http.HandlerFunc(ArgServer))
ページにアクセスすると、このページの担当者はArgServerとタイプHandlerFncがあります.HTTPサーバは、このタイプのServeHTTP方法を起動し、ArgServerを受信者として、逆にArgServerを呼び出します.
このセクションでは、構造、整数、チャネル、および関数からHTTPサーバを作成します.すべてはインターフェースに依存する方法であり、どのタイプにも定義できます.