3 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
您得到的w
是指向非導(dǎo)出類(lèi)型的指針,http.response
但與ResponseWriter
接口一樣,這是不可見(jiàn)的。
type ResponseWriter interface { ...}
另一方面,r
它是指向具體結(jié)構(gòu)的指針,因此需要顯式傳遞引用。
type Request struct { ...}

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
該http.ResponseWriter
是一個(gè)接口,并實(shí)現(xiàn)此接口的現(xiàn)有類(lèi)型的指針。這意味著不需要使用指向該接口的指針,因?yàn)樗呀?jīng)由指針“支持”。這個(gè)概念是由go develpers的一個(gè)描述了一下這里雖然類(lèi)型實(shí)現(xiàn)http.ResponseWriter并不需要是一個(gè)指針,它不實(shí)用,至少去http服務(wù)器之內(nèi)。
http.Request
不是一個(gè)接口,它只是一個(gè)結(jié)構(gòu),并且由于我們要更改此結(jié)構(gòu)并使Web服務(wù)器看到這些更改,因此它必須是一個(gè)指針。如果只是一個(gè)struct值,我們將修改它的副本,而調(diào)用我們的代碼的Web服務(wù)器看不到它。

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
正如此處和其他地方的許多其他答案中正確提到的那樣,它ResponseWriter
是一個(gè)界面,其含義已在SO答案和博客中進(jìn)行了詳細(xì)描述。
我要解決的是我的感覺(jué),這是一個(gè)巨大且危險(xiǎn)的誤解,原因是請(qǐng)求是通過(guò)“引用”傳遞的(盡管這樣的事情在Go中實(shí)際上并不存在)是“我們想要進(jìn)行更改使其對(duì)服務(wù)器可見(jiàn)”。
引用幾個(gè)答案:
[..]它只是一個(gè)結(jié)構(gòu),因?yàn)槲覀兿敫淖冞@個(gè)結(jié)構(gòu),并在Web服務(wù)器看到這些變化,它必須是一個(gè)指針[..] SO
[..]處理程序?qū)equest的更改需要對(duì)服務(wù)器可見(jiàn),因此我們僅通過(guò)引用而不是通過(guò)值來(lái)傳遞[..] SO
這是錯(cuò)誤的; 實(shí)際上,文檔明確警告不要篡改/更改請(qǐng)求:
除讀取正文外,處理程序不應(yīng)修改提供的請(qǐng)求。
相反,不是嗎?:-)
如果要更改請(qǐng)求,例如在將跟蹤標(biāo)頭傳遞給中間件鏈中的下一個(gè)處理程序之前附加跟蹤標(biāo)頭,則必須復(fù)制請(qǐng)求并將復(fù)制的版本向下傳遞給鏈。
Go團(tuán)隊(duì)提出了更改行為以允許修改傳入請(qǐng)求的請(qǐng)求,但更改此類(lèi)內(nèi)容可能會(huì)導(dǎo)致至少某些現(xiàn)有代碼意外中斷。
如果我們明確告訴人們不要更改請(qǐng)求,為什么還要使用指針?性能,Request
是一個(gè)大的結(jié)構(gòu),并復(fù)制它可以帶來(lái)性能的下降,尤其是在考慮長(zhǎng)期中間件鏈。團(tuán)隊(duì)必須權(quán)衡利弊,這絕對(duì)不是理想的解決方案,但是這里的權(quán)衡顯然是性能方面的問(wèn)題(而不是API安全性)。
- 3 回答
- 0 關(guān)注
- 589 瀏覽
添加回答
舉報(bào)