2016-04-28 27 views
5

httpとデフォルトのservemuxの違いは?この違いは何

func main() { 

    http.HandleFunc("/page2", Page2) 
    http.HandleFunc("/", Index) 
    http.ListenAndServe(":3000", nil) 
} 

そしてgolangを使用しては、マルチプレクサ

func main() { 
    mux := http.NewServeMux() 

    mux.HandleFunc("/page2", Page2) 
    mux.HandleFunc("/", Index) 
    http.ListenAndServe(":3000", mux) 
} 

答えて

2

ServerMuxHandlerインタフェースを実装するタイプであるサーブ、すべてのサーバーは1つを持っています。最初の例では、サーバーはデフォルトのハンドラーを使用しています。 NewServeMuxによって返されたマルチプレクサがデフォルトと同じになるため、私はここに違いがあるとは思わない。これは、要求処理をさらにカスタマイズできるように提供されています。あなたは、さらにカスタマイズすると(例えば、いくつかの理由のためにそれらをチェーン)そのための明示的なマルチプレクサを必要としない限り、実際には大きな違いがありません

var DefaultServeMux = NewServeMux() 

2

デフォルトのマルチプレクサは次のように定義されています。

デフォルトは既に割り当てられているので、何も理由なく別のものを作成する必要はありません。

8

最初のプログラムはdefault serve muxを使用します。これは、より詳細なと同じです:

func main() { 
    http.DefaultServeMux.HandleFunc("/page2", Page2) 
    http.DefaultServeMux.HandleFunc("/", Index) 
    http.ListenAndServe(":3000", http.DefaultServeMux) 
} 

二つのプログラムの間に1つの重要な違いがあります:最初のプログラムは、プログラムで使用されるハンドラを完全に制御を持っていません。 init()の機能(example)からのデフォルトのサブマルチプレクサに自動的に登録されるパッケージがあります。プログラムがこれらのパッケージの1つを直接的または間接的にインポートする場合、これらのハンドラによって登録されたハンドラは、最初のプログラムでアクティブになります。

第2のプログラムは、サーバで使用されるハンドラを完全に制御します。デフォルトのサブマルチプレクサに登録されたハンドラはすべて無視されます。

関連する問題