2 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
在Go聊天室中,我讀到了一些關(guān)于最好避免盡可能避免使用空界面的討論,但沒有適當(dāng)?shù)膮?shù)。其他人自豪地回應(yīng)說,他們的代碼設(shè)計(jì)中沒有空接口。
最大的問題是你失去了所有的打字;例如,假設(shè)我有一個(gè)函數(shù),我想對(duì)各種類型的數(shù)字進(jìn)行操作,所以我寫:
func AddOne(n interface{}) int64 {
switch nn := n.(type) {
case int:
return nn + 1
case int8:
return nn + 1
// ... etc...
}
}
但是,如果我將0.42(float64)傳遞給此函數(shù)或字符串怎么辦?如果函數(shù)接受int64(),那么我們將在編譯時(shí)收到有關(guān)此的警告,但是由于一切都是有效的,因此您不會(huì)得到任何東西。"asd"func AddOne(n int64) int64interface{}
你能做的最好的事情就是在運(yùn)行時(shí)處理這個(gè)問題,或者panic()或返回一個(gè)錯(cuò)誤;這顯然比編譯時(shí)錯(cuò)誤要清晰得多。
這是迄今為止最大的缺點(diǎn)。
我必須特別看到這些和函數(shù)的細(xì)節(jié),但是使用空接口有一些很好的理由;例如,當(dāng)您想要接受某些自定義結(jié)構(gòu),然后使用反射根據(jù)某些外部數(shù)據(jù)在結(jié)構(gòu)上設(shè)置值時(shí)。這本質(zhì)上是諸如此類的軟件包所做的,但它也通常用于解析某些配置文件等。AppConfigurationUserPreferencesencoding/json
這聽起來像并且可能適合這一點(diǎn),因?yàn)閹?框架不知道你的應(yīng)用程序配置需要什么設(shè)置,或者有什么用戶首選項(xiàng)。但就像我說的,如果沒有細(xì)節(jié),很難確定。AppConfigurationUserPreferences
另一個(gè)用例是當(dāng)你真的想接受各種各樣的類型時(shí);將參數(shù)傳遞給 SQL 查詢是一個(gè)常見示例,或者 .fmt.Printf()
一般來說,避免可能是最好的,但如果你發(fā)現(xiàn)自己這樣做而彎腰,那么最好只是使用并忍受缺乏打字。interface{}interface{}

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
空命名接口在 Go 中沒有意義,因?yàn)榕c C# 等其他語言不同,例如,如果任何類型(C# 中的類)與接口簽名匹配,則可以將其強(qiáng)制轉(zhuǎn)換為特定接口。因此,在Go中,“類”(結(jié)構(gòu)類型)不需要從接口繼承(例如,在類型定義時(shí)聲明接口)。
所以你的問題的答案:
Go 中空接口的最佳做法是不在 Go 中定義命名的空接口。
更新:感謝下面的評(píng)論,我已經(jīng)改變了主意,我同意使用空命名接口的用例有限,以便文檔和在IDE中更快地導(dǎo)航。
- 2 回答
- 0 關(guān)注
- 125 瀏覽
添加回答
舉報(bào)