亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何擴充 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 中?,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標頭值。


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

TA貢獻1876條經驗 獲得超7個贊

你不能。

w是一個http.ResponseWriter,它是一種接口類型——所以只有方法,沒有直接可訪問的字段。如您所知,它有一種獲取底層Header地圖的方法。

但是,它沒有用于替換地圖的“Setter”方法。因此,復制標頭值的唯一方法是像您引用的循環那樣手動復制。


查看完整回答
反對 回復 2022-11-28
  • 2 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號