所以我确定我想在这里作弊,但 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
标头值。
幕布斯6054654
TA贡献1876条经验 获得超7个赞
你不能。
w
是一个http.ResponseWriter,它是一种接口类型——所以只有方法,没有直接可访问的字段。如您所知,它有一种获取底层Header
地图的方法。
但是,它没有用于替换地图的“Setter”方法。因此,复制标头值的唯一方法是像您引用的循环那样手动复制。
- 2 回答
- 0 关注
- 111 浏览
添加回答
举报
0/150
提交
取消