3 回答

TA貢獻1829條經(jīng)驗 獲得超6個贊
任何數(shù)據(jù)類型的有用性都取決于要解決的問題和用于解決該問題的方法。如果數(shù)據(jù)類型不適合該問題,那么它根本就不適合該問題-僅此而已。
Go編程語言(以及大多數(shù)其他編程語言)基于程序員可以用來構(gòu)建新數(shù)據(jù)類型的簡單規(guī)則。其中一些規(guī)則是:
*T
:創(chuàng)建一個新數(shù)據(jù)類型,該數(shù)據(jù)類型是指向T的指針[10]T
:Ts數(shù)組struct { t T; u U ... }
:包含T作為組成部分的結(jié)構(gòu)...
程序員可以通過組合這些簡單的規(guī)則來創(chuàng)建復(fù)雜的數(shù)據(jù)類型。可能的數(shù)據(jù)類型總數(shù)超過了有用的數(shù)據(jù)類型總數(shù)。顯然,存在(并且必須存在)完全沒有用的數(shù)據(jù)類型。這只是建立新數(shù)據(jù)類型的規(guī)則很簡單這一事實的自然結(jié)果。
類型**T
屬于不太可能出現(xiàn)在程序中的類型類別??梢詫懙?code>*****T事實并不意味著這種類型必須非常有用。
最后,您的問題的答案:
該類型**T
通常出現(xiàn)在我們想要將一個類型的值的用戶重定向T
到另一個類型的值的上下文中T
,但是由于某些原因,我們無法訪問該值的所有用戶,或者發(fā)現(xiàn)這些用戶會花費太多時間:
我們不想復(fù)制類型的值
T
(由于某種原因)我們希望所有類型
T
為值的用戶都可以通過指針訪問該值我們想要快速將類型為特定值的所有用戶重定向
T
到另一個值
在這種情況下,使用**T
是很自然的,因為它允許我們在O(1)中實現(xiàn)第三步:
type User_of_T struct {
Value **T
}
// Redirect all users of a particular value of type T
// to another value of type T.
func (u *User_of_T) Redirect(t *T) {
*(u.Value) = t
}

TA貢獻1877條經(jīng)驗 獲得超6個贊
在C語言中,指向指針的指針很常見。例如:
更多維數(shù)組(例如,字符串數(shù)組,
char** argv
可能是此處最突出的示例)指針作為輸出參數(shù)
但是,在Go中,很少有指向指針的指針。切片類型(也可以在內(nèi)部存儲一個指針)而不是通過指針訪問數(shù)組。因此,您仍然可以通過在Go中使用切片來獲得相同類型的間接訪問,但通常不會看到類似**int
此處的內(nèi)容。
但是,第二個示例可能仍然適用于Go程序。假設(shè)您有一個函數(shù),應(yīng)該可以更改作為參數(shù)傳遞的指針。在這種情況下,您將必須將指針傳遞給該指針,以便可以更改原始指針。這在C語言中極為常見,因為函數(shù)只能返回一個值(通常是某種錯誤代碼),并且如果要返回附加的指針,則必須使用指向該指針的指針作為輸出參數(shù)。但是,Go中的函數(shù)可以返回多個值,因此,指向指針的情況也很少見。但是它們可能仍然有用,并且在某些情況下可能會導(dǎo)致更好的API。
例如,atomic.StorePointer函數(shù)可能是標準庫中的指針的罕見但隱藏得很好的用例之一。
- 3 回答
- 0 關(guān)注
- 256 瀏覽
添加回答
舉報