goでプログラミングした際に、文法間違いやエラーチェックが抜けている箇所を指摘してくれるgolangci-lintを使ってみます。
golangci-lint インストール
brew install golangci-lint
brew upgrade golangci-lint
Goを書く
package main
import (
"net/http"
)
func middleware1(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("before middleware\n"))
next.ServeHTTP(w, r)
})
}
func middleware2(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
next.ServeHTTP(w, r)
w.Write([]byte("after middleware\n"))
})
}
func main() {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World\n"))
})
http.Handle("/", middleware1(middleware2(handler)))
http.ListenAndServe(":8080", nil)
}
golangci-lintを実行する
メソッドがerrorを返してくるけど、実際にエラーチェックしてない箇所を指摘してくれています。
golangci-lint run main.go
main.go:9:10: Error return value of `w.Write` is not checked (errcheck)
w.Write([]byte("before middleware\n"))
^
main.go:17:10: Error return value of `w.Write` is not checked (errcheck)
w.Write([]byte("after middleware\n"))
^
main.go:23:10: Error return value of `w.Write` is not checked (errcheck)
w.Write([]byte("Hello World\n"))
^
main.go:28:21: Error return value of `http.ListenAndServe` is not checked (errcheck)
http.ListenAndServe(":8080", nil)
プログラムを修正
package main
import (
"net/http"
)
func middleware1(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write([]byte("before middleware\n"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
next.ServeHTTP(w, r)
})
}
func middleware2(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
next.ServeHTTP(w, r)
_, err := w.Write([]byte("after middleware\n"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
})
}
func main() {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, err := w.Write([]byte("Hello World\n"))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
})
http.Handle("/", middleware1(middleware2(handler)))
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic(err)
}
}
再度golangci-lintを実行
何も指摘がないので、OKそう。
golangci-lint run main.go