你正在使用哪个版本的Go( go version
)?
$ go version
go version go1.11 linux/amd64
这个问题在最新版本中是否会重现?
是的。
你正在使用什么操作系统和处理器架构( go env
)?
$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/adam/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/adam/code"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build369596792=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
考虑以下代码:
package main
import (
"encoding/json"
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/ping", func (w http.ResponseWriter, r *http.Request) {
type response struct {
Error error `json:"error"`
}
if err := json.NewEncoder(w).Encode(response{nil}); err != nil {
fmt.Println(err)
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
})
go http.ListenAndServe(":6060", nil)
resp, err := http.Get("http://localhost:6060")
if err != nil {
panic(err)
}
fmt.Println(resp.Header.Get("Content-Type"))
}
这段代码输出:
$ go run /tmp/vet/main.go
text/plain; charset=utf-8
评论
让vet意识到这个常见的错误并能够提醒开发者一个简单的解决方法是很不错的。 http.ResponseWriter
的文档描述了所有的细节,但通常会被忽略。
3条答案
按热度按时间xlpyo6sf1#
@adamdecaf 这个新的验证逻辑需要忽略设置拖车的情况吗?
nc1teljy2#
/cc @alandonovan@josharian@mvdan per owners .
Also /cc @dominikh in case this is one of the checks you've considered previously for staticcheck.
vsaztqbk3#
我迅速使用空值检查器的方法进行了原型设计,寻找一个由将w转换为io.Writer的调用主导的w.Header().Set()。你可以通过识别在它仍然是一个ResponseWriter时可能写入w的其他函数来进一步进行。
我已经附上了在标准库中找到的日志--所有的测试,不出所料。
'
responsewriter.txt
顺便说一下:我希望你只为这个例子写了
go http.ListenAndServe(":6060", nil)
,因为它会丢弃错误结果。;)