Golang net/httpバッグは同時に複数のポートを傍受します。

922 ワード

背景はgolangで複数のポートを同時に傍受してhttp要求に対して同じ処理を行う必要があります。
実現する
コードは以下のとおり簡単です。
func handler1(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello!")
}

func main() {
	ports := []string{":25000", ":25001"}
	for _, v := range ports {
		go func(port string) { //         goroutine    
			mux := http.NewServeMux()
			mux.HandleFunc("/", handler1)
			http.ListenAndServe(port, mux)
		}(v)
	}
	select {}
}
注意点
1そのままgoroutineにレンゲを使って出てくるvalueは、レンゲvariable v captured by func literalを提示します。
go func() { 
			mux := http.NewServeMux()
			mux.HandleFunc("/", handler1)
			http.ListenAndServe(v, mux)
		}()
goroutineでvを使用すると、vの値はリストの最後の値になります。https://segmentfault.com/a/1190000010884717
2 select{}forを使わないでループしてgoroutineを生成して直接に0.0を脱退しました。もちろん私達が欲しいのではないです。コードを一つ追加して止められます。
3もちろん、異なるポートで受信した情報を異なる処理するには、自分で判断を加える必要があります。