为了账号安全,请及时绑定邮箱和手机立即绑定

如何扩充 ResponseWriter 的 Header() 返回的地图

如何扩充 ResponseWriter 的 Header() 返回的地图

Go
慕神8447489 2022-11-28 17:08:44
所以我确定我想在这里作弊,但 ResponseWriter 文档有一个方法“Header()”,它返回它正在使用的 Header 对象。 https://pkg.go.dev/net/http#ResponseWriter.Header现在我从其他地方获得了一个 http.Response,我想将所有标头从那里复制到我的 ResponseWriter 中。现在,我可以像这样使用 for 循环:for k := range resp.Header     w.Header().Add(k, resp.Header.Get(k))}从逻辑上讲,将 ResponseWriter 的标头中的引用更改为 Response 的标头对我来说也是有意义的,但是似乎 ResponseWriter 类型正在积极地试图阻止我这样做。像这样愚蠢的事情浮现在脑海w.Header() = resp.Header或者rwHeader := w.Header()rwHeader = resp.Header显然,这两个都没有意义,根本不起作用,但希望能传达我正在尝试做的事情的想法。任何人都可以解释为什么我正在尝试做的事情不起作用吗?或者也许确实如此,但我只是没有看到这样做的方法?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

您不必自己编写该循环。Go 1.18 看到了 package 的添加golang.org/x/exp/maps,它提供了一个方便的Copy功能

func Copy[M ~map[K]V, K comparable, V any](dst, src M)

Copy复制所有键/值对,src将它们添加到dst. 当输入中的键src已经存在于中时dst,输入中的值dst将被与输入中的键关联的值覆盖src

import "golang.org/x/exp/maps"
// ...
maps.Copy(w.Header(), resp.Header)

但是,请注意,由于响应可以包含重复的标头,因此使用maps.Copy并不完全等同于您的循环:

for k := range resp.Header 
    w.Header().Add(k, resp.Header.Get(k))
}

与 相反maps.Copy,您的循环仅检索与 中存在的每个标头名称相对应的第一个resp.Header标头值。


查看完整回答
反对 回复 2022-11-28
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

你不能。

w是一个http.ResponseWriter,它是一种接口类型——所以只有方法,没有直接可访问的字段。如您所知,它有一种获取底层Header地图的方法。

但是,它没有用于替换地图的“Setter”方法。因此,复制标头值的唯一方法是像您引用的循环那样手动复制。


查看完整回答
反对 回复 2022-11-28
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信