質問するログイン新規登録

回答編集履歴

2

省略しないコード例を追記

2019/11/22 00:41

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -30,4 +30,39 @@
30
30
  http.Handleを呼ぶとhttp.DefaultServeMuxにパスプレフィックスとハンドラインスタンスをセットで記録しています。
31
31
  http.DefaultServeMuxもまたhttp.Handlerを満たすインスタンスでリクエストのたびにServeHTTPメソッドが呼ばれます。
32
32
 
33
- これらが連携してハンドラのServeHTTPが呼ばれる仕掛けになっています。
33
+ これらが連携してハンドラのServeHTTPが呼ばれる仕掛けになっています。
34
+
35
+ いろいろ省略している記述を省略せずに書くと以下のようになります
36
+ [https://play.golang.org/p/ZgQau4jhyc3](https://play.golang.org/p/ZgQau4jhyc3)
37
+ ```go
38
+ package main
39
+
40
+ import (
41
+ "fmt"
42
+ "log"
43
+ "net/http"
44
+ )
45
+
46
+ type loginFunc func(w http.ResponseWriter, r *http.Request) error
47
+
48
+ func login(w http.ResponseWriter, r *http.Request) error {
49
+ return nil
50
+ }
51
+
52
+ func (f loginFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) {
53
+ if err := f(w, r); err != nil {
54
+ http.Error(w, "login failed", http.StatusForbidden)
55
+ return
56
+ }
57
+ fmt.Fprintf(w, "hello")
58
+ }
59
+
60
+ func main() {
61
+ mux := http.NewServeMux()
62
+ mux.Handle("/", loginFunc(login))
63
+ server := &http.Server{Addr: ":8080", Handler: mux}
64
+ if err := server.ListenAndServe(); err != nil {
65
+ log.Fatal(err)
66
+ }
67
+ }
68
+ ```

1

追記

2019/11/22 00:41

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -24,4 +24,10 @@
24
24
  server := &Server{Addr: addr, Handler: handler}
25
25
  return server.ListenAndServe()
26
26
  }
27
- ```
27
+ ```
28
+
29
+ また、ListenAndServeの第二引数にnilを渡した場合、http.DefaultServeMuxが代わりに使われます。
30
+ http.Handleを呼ぶとhttp.DefaultServeMuxにパスプレフィックスとハンドラインスタンスをセットで記録しています。
31
+ http.DefaultServeMuxもまたhttp.Handlerを満たすインスタンスでリクエストのたびにServeHTTPメソッドが呼ばれます。
32
+
33
+ これらが連携してハンドラのServeHTTPが呼ばれる仕掛けになっています。