Go语言中http.ResponseWriter作为函数参数传递时如何修改响应?
问题本质澄清
http.ResponseWriter 是Go标准库定义的接口类型,接口变量传递时存储的是底层实现实例的引用,根本不需要额外传指针,你遇到的修改不生效问题完全是代码执行顺序错误导致的。
HTTP响应的写入有严格顺序要求:设置Header → 写入状态码 → 写入响应体,你现有代码先执行Encode写响应体,此时Go会自动发送默认的200状态码和响应头,后续再设置Content-Type、写403状态码的操作都会失效。
修正后的实现代码
func authError(w http.ResponseWriter, err error, clientMsg string) { // 打印错误日志(顺序不影响响应,放最前面即可) log.Printf("Authentication failed: %v", err) // 1. 先设置响应头 w.Header().Set("Content-Type", "application/json") // 2. 再写入响应状态码 w.WriteHeader(http.StatusForbidden) // 3. 最后写入响应体 _ = json.NewEncoder(w).Encode(struct { Error string `json:"error"` }{Error: clientMsg}) }
调用示例
res, err := doSomeCheck() if err != nil { authError(w, err, "something is broke!") return }
内容的提问来源于stack exchange,提问作者Avishay28
相关产品推荐
相关产品推荐

