You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:57:00