所以我確定我想在這里作弊,但 ResponseWriter 文檔有一個方法“Header()”,它返回它正在使用的 Header 對象。 https://pkg.go.dev/net/http#ResponseWriter.Header現在我從其他地方獲得了一個 http.Response,我想將所有標頭從那里復制到我的 ResponseWriter 中?,F在,我可以像這樣使用 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 關注
- 131 瀏覽
添加回答
舉報
0/150
提交
取消