回答編集履歴

2

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

2019/11/22 00:41

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -63,3 +63,73 @@
63
63
 
64
64
 
65
65
  これらが連携してハンドラのServeHTTPが呼ばれる仕掛けになっています。
66
+
67
+
68
+
69
+ いろいろ省略している記述を省略せずに書くと以下のようになります
70
+
71
+ [https://play.golang.org/p/ZgQau4jhyc3](https://play.golang.org/p/ZgQau4jhyc3)
72
+
73
+ ```go
74
+
75
+ package main
76
+
77
+
78
+
79
+ import (
80
+
81
+ "fmt"
82
+
83
+ "log"
84
+
85
+ "net/http"
86
+
87
+ )
88
+
89
+
90
+
91
+ type loginFunc func(w http.ResponseWriter, r *http.Request) error
92
+
93
+
94
+
95
+ func login(w http.ResponseWriter, r *http.Request) error {
96
+
97
+ return nil
98
+
99
+ }
100
+
101
+
102
+
103
+ func (f loginFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) {
104
+
105
+ if err := f(w, r); err != nil {
106
+
107
+ http.Error(w, "login failed", http.StatusForbidden)
108
+
109
+ return
110
+
111
+ }
112
+
113
+ fmt.Fprintf(w, "hello")
114
+
115
+ }
116
+
117
+
118
+
119
+ func main() {
120
+
121
+ mux := http.NewServeMux()
122
+
123
+ mux.Handle("/", loginFunc(login))
124
+
125
+ server := &http.Server{Addr: ":8080", Handler: mux}
126
+
127
+ if err := server.ListenAndServe(); err != nil {
128
+
129
+ log.Fatal(err)
130
+
131
+ }
132
+
133
+ }
134
+
135
+ ```

1

追記

2019/11/22 00:41

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -51,3 +51,15 @@
51
51
  }
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ また、ListenAndServeの第二引数にnilを渡した場合、http.DefaultServeMuxが代わりに使われます。
58
+
59
+ http.Handleを呼ぶとhttp.DefaultServeMuxにパスプレフィックスとハンドラインスタンスをセットで記録しています。
60
+
61
+ http.DefaultServeMuxもまたhttp.Handlerを満たすインスタンスでリクエストのたびにServeHTTPメソッドが呼ばれます。
62
+
63
+
64
+
65
+ これらが連携してハンドラのServeHTTPが呼ばれる仕掛けになっています。