ホームページ  >  記事  >  バックエンド開発  >  golangでサーバーを立てるにはどうすればいいですか?

golangでサーバーを立てるにはどうすればいいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-06-20 09:46:384037ブラウズ

golangでサーバーを立てるにはどうすればいいですか?

Golang でサーバーを作成するにはどうすればよいですか?

golang でサーバーを作成する方法:

golang の net/http パッケージがネットワークを非常によくサポートしていることはわかっています。比較 比較的単純なサーバーをセットアップするのは簡単です。コードの一部を見てみましょう

func sayHi(w http.ResponseWriter, r *http.Request)  {
    fmt.Fprint(w,"Hi")
}
func main() {
    http.HandleFunc("/sayHi", sayHi)
    log.Fatal(http.ListenAndServe("localhost:8080", nil))
}

ここでは比較的単純なサーバーがセットアップされています。これは何を意味しますか?ここで、ローカル マシンのポートをリッスンし、クライアントのリクエストを受け入れ、対応するデータでクライアントに応答します。

もう一度コードを見てみましょう

func sayHi(w http.ResponseWriter, r *http.Request)  {
    fmt.Fprint(w,"Hi")
}
func main() {
    serveMux := http.DefaultServeMux
    serveMux.HandleFunc("/sayHi", sayHi)
    log.Fatal(http.ListenAndServe("localhost:8080", serveMux))
}

この 2 つのコードは同じ機能を持っていますが、記述方法にいくつかの違いがあります。 DefaultServeMux は次の目的で使用されます。

コードの最初の部分では、HandleFunc 関数のソース コードを見てみましょう。

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

ソース コードでこの関数を呼び出すと、その中のメソッドが呼び出されます。

func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    mux.Handle(pattern, HandlerFunc(handler))
}

このメソッドは ServeMux 構造上で定義されていますが、この ServeMux は正確に何をするのでしょうか?今は気にせず、ソース コードに従って下を見てみましょう。ここでは、ServeMux 構造体で定義された Handle メソッドが呼び出されています。このメソッドの具体的な機能を見てみましょう。

func (mux *ServeMux) Handle(pattern string, handler Handler) {
    mux.mu.Lock()
    defer mux.mu.Unlock()
    if pattern == "" {
        panic("http: invalid pattern")
    }
    if handler == nil {
        panic("http: nil handler")
    }
    if _, exist := mux.m[pattern]; exist {
        panic("http: multiple registrations for " + pattern)
    }
    if mux.m == nil {
        mux.m = make(map[string]muxEntry)
    }
    mux.m[pattern] = muxEntry{h: handler, pattern: pattern}
    if pattern[0] != '/' {
        mux.hosts = true
    }
}

ここでは、パターンやハンドラーなど、何かが ServeMux に追加されているようです。これらのものを追加することに何の意味があるのでしょうか?戻って、上部の 2 番目のコードを見てみましょう。

serveMux := http.DefaultServeMux
serveMux.HandleFunc("/sayHi", sayHi)

前のコードの大きなセクションは、これら 2 行のコードの準備です。このように記述されている場合は、独自に定義した関数 SayHi をserveMux に入れる必要があります。ただし、golang がすでにそれを行っています。デフォルトのserveMuxはDefaultServeMuxで、アクセスする必要があるURLパス/sayHi、対応する処理方法はDefaultServeMux内で1対1対応なので、ここで少し理解できましたが、このDefaultServeMuxにはアクセスパスと要件が保存されますか?処理メソッドのコレクションについてはどうでしょうか?

はい、保存されているのはパターンに対応するハンドラーで、ここではルーティングと呼びます。

それでは、これはどのように動作するのでしょうか? ここでは、http.ListenAndServe("localhost:8080",serveMux) ソース コードを確認する必要があります。

実装方法を見てみましょう。ここのソース コードは比較的長いです。より重要な段落を選択して見てみましょう。

func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}

ここでリスニング アドレスを渡します。さらに下に進むと、

go c.serve(ctx)

ここで、ゴルーチンが開始され、各クライアントのリクエストを処理し、最終的な処理が行われます。は c.serve で行われます。 この方法では、注目すべき点が 1 つあります。

serverHandler{c.server}.ServeHTTP(w, w.req)

ここでは別の ServeHTTP メソッドが呼び出されます。このメソッドが何を処理するかを見てみましょう。

このメソッドでは、このようなコードが見られます

if handler == nil {
        handler = DefaultServeMux
    }
...
handler.ServeHTTP(rw, req)

ここでは、ハンドラーが渡されない場合、デフォルトの DefaultServeMux が使用されることがわかります。最初の段落でその理由がわかりました。コードでは、nil を渡す必要があります。その後、handler.ServeHTTP(rw, req) がインターフェイス Handler の実装メソッドを呼び出します。このようにして、特定のパターンがどのハンドラーに対応するかを決定できます。このサーバーの一般原理は何ですか? もちろん、これは非常に表面的な分析であり、さらに深く研究する必要があることがたくさんあります。

推奨チュートリアル: 「go 言語チュートリアル

以上がgolangでサーバーを立てるにはどうすればいいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。