3 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
顧名思義,指針是指向內(nèi)存中某個(gè)位置的變量。
您在復(fù)制對(duì)象的整個(gè)值由于某種原因不合理時(shí)使用它。這可能是因?yàn)橐粋€(gè)對(duì)象太大以至于復(fù)制它會(huì)很慢,所以您只想將一個(gè)小指針傳遞給該對(duì)象并在內(nèi)存中使用相同的對(duì)象(可能是 http.Request 是一個(gè)指針的原因),或者因?yàn)槟枰薷膶?duì)代碼中其他地方可能已經(jīng)引用的對(duì)象的現(xiàn)有引用。您可以在此處查看net/http 的代碼以了解原因。(事實(shí)上,對(duì)于任何 Go 標(biāo)準(zhǔn)庫(kù),如果你想研究為什么或如何以某種方式完成某事,代碼是開(kāi)放的。)
但這有點(diǎn)無(wú)關(guān)緊要,因?yàn)樽鳛橛脩?,您傳遞指針的原因是因?yàn)楹瘮?shù)被定義為將指針作為參數(shù)。編寫(xiě)庫(kù)的程序員決定使用指針的原因是什么并不重要。您可以查找 go 文檔,或者您可以做您正在做的事情,并且只傳遞一個(gè)值,如果編譯器抱怨修復(fù)它。

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
當(dāng)您只是了解它們的工作原理時(shí),指針是非常簡(jiǎn)單的概念,但是在理解之前,它確實(shí)看起來(lái)很難且令人討厭,尤其是在 C 中。有指針?biāo)阈g(shù)、指向指針的指針等。
無(wú)論如何,您不必使用指針,如果您的庫(kù)不強(qiáng)制您使用,但由于函數(shù)作用域的原因,傳遞變量、函數(shù)周?chē)臄?shù)據(jù)結(jié)構(gòu)可能會(huì)將所有內(nèi)容復(fù)制到另一個(gè)內(nèi)存部分。
在大多數(shù)語(yǔ)言中,值是通過(guò)文字傳遞的。這意味著當(dāng)您將變量傳遞給函數(shù)或類(lèi)時(shí),它可能會(huì)復(fù)制它。
更多的內(nèi)存消耗,也需要 CPU 時(shí)間來(lái)復(fù)制項(xiàng)目。不利于復(fù)雜性。
另一方面,像 PHP 這樣的一些語(yǔ)言有一些自動(dòng)化,比如copy on write algorithm當(dāng)你將一個(gè)參數(shù)傳遞給它通過(guò)引用傳遞的函數(shù)時(shí),它只將內(nèi)存地址傳遞給函數(shù),直到函數(shù)嘗試寫(xiě)入這個(gè)變量,在那個(gè)時(shí)候它只是復(fù)制變量.
但自動(dòng)化也會(huì)帶來(lái)一些成本。costGo的真正重點(diǎn)是盡可能快,少自動(dòng)化,多用戶控制,但也嘗試安全和簡(jiǎn)單。不像 C、C++,它不會(huì)讓你感到羞恥。
在您的示例中,http.ResponseWriter當(dāng)您通過(guò)其內(nèi)存引用(作為指針)將其傳遞給 any 函數(shù)時(shí),您在此函數(shù)內(nèi)向其寫(xiě)入內(nèi)容,它只是直接寫(xiě)入它,沒(méi)有特殊算法或檢查是否沒(méi)有類(lèi)型不匹配等. 可能有一些像垃圾收集器這樣的檢查,但它確實(shí)帶來(lái)了好處而不是成本。
同樣在 PHP 中,Java 對(duì)象通過(guò)它們的引用傳遞,但該語(yǔ)言只是隱藏了這種冗長(zhǎng)。
我讀過(guò)接口實(shí)際上是指針
不完全I(xiàn)nterface{}是,Go 中是基類(lèi)型,所以每個(gè)類(lèi)型都實(shí)現(xiàn)了接口類(lèi)型,從這個(gè)角度來(lái)看,它只是一個(gè)類(lèi)型,因此作為指針調(diào)用沒(méi)有任何意義。它給你一個(gè)活力,例如:如果你從一個(gè)數(shù)據(jù)沒(méi)有結(jié)構(gòu)化和不一致的源讀取,結(jié)構(gòu)可以隨時(shí)改變,例如 XML 或 JSON 源。只需使用界面!您已經(jīng)知道每種類(lèi)型的祖先都是接口,它只會(huì)在運(yùn)行時(shí)處理數(shù)據(jù)的底層結(jié)構(gòu)/類(lèi)型。
但是您也可以使用接口術(shù)語(yǔ)來(lái)定義接口(如 java、c#、php 等)并放置實(shí)現(xiàn)方法。當(dāng)任何滿足這些方法的結(jié)構(gòu)體時(shí)。它自然地實(shí)現(xiàn)了接口。此實(shí)現(xiàn)設(shè)計(jì)稱(chēng)為 Duck Typing,請(qǐng)閱讀以獲取更多信息https://en.wikipedia.org/wiki/Duck_typing

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以將指針視為指向?qū)ο髢?nèi)存地址的值。與大多數(shù)數(shù)據(jù)結(jié)構(gòu)相比,指針很?。ū热?8 個(gè)字節(jié))。
很多時(shí)候你會(huì)得到一個(gè)指向?qū)ο蟮闹羔槪驗(yàn)閭鬟f這 8 個(gè)字節(jié)比創(chuàng)建你想要傳遞的整個(gè)對(duì)象的副本要快得多。
在 Request 對(duì)象的情況下,與僅傳遞可以訪問(wèn)原始數(shù)據(jù)的指針相比,創(chuàng)建請(qǐng)求下所有內(nèi)容的副本(有效負(fù)載、標(biāo)頭等)的成本非常高。
- 3 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報(bào)