新聞中心
大家好,我是煎魚(yú)。

創(chuàng)新互聯(lián)是少有的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、營(yíng)銷(xiāo)型企業(yè)網(wǎng)站、小程序設(shè)計(jì)、手機(jī)APP,開(kāi)發(fā)、制作、設(shè)計(jì)、友情鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,公司2013年成立,堅(jiān)持透明化,價(jià)格低,無(wú)套路經(jīng)營(yíng)理念。讓網(wǎng)頁(yè)驚喜每一位訪(fǎng)客多年來(lái)深受用戶(hù)好評(píng)
如果說(shuō)在 Go 里要有一句與 interface{} 相關(guān),你會(huì)想到什么?是萬(wàn)物皆要定義 interface,否則沒(méi)法抽象?
Go 諺語(yǔ)中認(rèn)可的是:"interface{} says nothing",也就是 interface{} 什么也沒(méi)說(shuō)。這指的又什么,太黑話(huà)了吧...
今天就煎魚(yú)和大家一起學(xué)習(xí)。
接口類(lèi)型無(wú)自描述
interface{} 的第一種用法,那就是變量的數(shù)據(jù)類(lèi)型聲明。結(jié)合其它語(yǔ)言來(lái)看,一共有如下幾種形式:
let i:any = 1; // Typescript
std::any i = 1; // C++17
Object i = 1; // Java
var i interface{} = 1 // Go
Go 在 1.18 后,也支持了 any 關(guān)鍵字的聲明方法,是類(lèi)似 interface{} 的作用,各路語(yǔ)言都趨同了。
在實(shí)際編程中頻繁的用接口(interface{})類(lèi)型作為變量的類(lèi)型有沒(méi)有問(wèn)題呢?
明確的聲明
當(dāng)我們?cè)陂喿x Go 代碼時(shí)。如果文檔、命名、、參數(shù)(含類(lèi)型)是清晰的,可靠的。我們大概率會(huì)直接調(diào)用,明確的類(lèi)型會(huì)更讓我們有 ”安全感“,知道要傳什么值。
如下函數(shù)簽名:
func Eat(v string) { ... }當(dāng)然知道調(diào)用 Eat 函數(shù)要傳 string 類(lèi)型了,不是傳什么 int 類(lèi)型。
未知的聲明
如果一個(gè)函數(shù)的參數(shù)的類(lèi)型是 interface{},我們就會(huì)進(jìn)函數(shù)內(nèi)看其具體的實(shí)現(xiàn),以此尋求確定性。
如下函數(shù)簽名:
func Eat(v interface{}) { ... }請(qǐng)問(wèn)變量 v 到底傳什么,傳 int 類(lèi)型,還是 string 類(lèi)型,又或是都可以?
正如諺語(yǔ)中所說(shuō),定義了 interface{},是什么都沒(méi)說(shuō),顯然是 “不大好的味道”,這樣的代碼無(wú)法自描述。程序員得翻代碼或文檔(文檔還不一定更新的及時(shí))。
注:在公司真見(jiàn)到這種場(chǎng)景,該位同學(xué)猜不透,大呼絕絕子,翻代碼去了。
小接口優(yōu)于大接口
在 Go 的標(biāo)準(zhǔn)庫(kù)中,package io 的 io.Reader 和 io.Writer 接口是官方認(rèn)可的教科書(shū)式案例,小而美的接口是編寫(xiě)強(qiáng)大而靈活的 Go 代碼的關(guān)鍵。
io.Reader:
type Reader interface {
Read(p []byte) (n int, err error)
}io.Writer:
type Writer interface {
Write(p []byte) (n int, err error)
}小接口與大接口相比,用戶(hù)認(rèn)知的心智和實(shí)現(xiàn)成本較低。
從現(xiàn)實(shí)情況來(lái)講,當(dāng)一個(gè) Go 代碼庫(kù)中擁有 6 個(gè),甚至更多的大型接口往往只有兩種實(shí)現(xiàn),那就是唯一的具體實(shí)現(xiàn)和一個(gè)用于測(cè)試的模擬實(shí)現(xiàn)。
另外從歷史的角度來(lái)看, io.Reader 和 io.Writer 接口并不是前期設(shè)計(jì)的,它們是后來(lái)發(fā)現(xiàn)的。Network、File 和其他字節(jié)處理類(lèi)型需要共享類(lèi)似的實(shí)現(xiàn),才誕生的 io.Reader 和 io.Writer 。
“最佳實(shí)踐” 都是實(shí)踐、探索、演變出來(lái)的。
總結(jié)
今天我們對(duì) Go 諺語(yǔ)中的:"interface{} says nothing" 進(jìn)行了大致的了解,內(nèi)容不多,核心的官方建議在于:
- 接口類(lèi)型,沒(méi)有明確的類(lèi)型自描述,會(huì)在編程、協(xié)作、文檔等均帶來(lái)一定的麻煩,就跟什么都沒(méi)說(shuō)一樣。不建議頻繁使用。
- 小接口和大接口:
當(dāng)一個(gè)接口定義擁有 6 個(gè)或更多的接口方法時(shí),它非常的雞肋,一般只有自身的具體實(shí)現(xiàn)和測(cè)試實(shí)現(xiàn)。
建議多采取小接口的方式,認(rèn)知和實(shí)現(xiàn)成本低。官方認(rèn)可的最佳實(shí)踐是 io.Reader 和 io.Writer 接口,太大的接口并沒(méi)有太多的好處。
你覺(jué)得這個(gè) Go 諺語(yǔ)靠譜嗎?你是否有大接口的使用經(jīng)驗(yàn)?
Go1.18 有了泛型后,泛型具有的相對(duì)定義,是否可以解決這個(gè)問(wèn)題?
分享標(biāo)題:用Gointerface{}等于什么也沒(méi)說(shuō)
路徑分享:http://www.fisionsoft.com.cn/article/dhgdgog.html


咨詢(xún)
建站咨詢(xún)
