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 サイトの他の関連記事を参照してください。