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

所以我确定我想在这里作弊,但 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

显然,这两个都没有意义,根本不起作用,但希望能传达我正在尝试做的事情的想法。


任何人都可以解释为什么我正在尝试做的事情不起作用吗?或者也许确实如此,但我只是没有看到这样做的方法?


慕神8447489
浏览 114回答 2
2回答

吃鸡游戏

您不必自己编写该循环。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

你不能。w是一个http.ResponseWriter,它是一种接口类型——所以只有方法,没有直接可访问的字段。如您所知,它有一种获取底层Header地图的方法。但是,它没有用于替换地图的“Setter”方法。因此,复制标头值的唯一方法是像您引用的循环那样手动复制。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go