3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
正如已經(jīng)提到的,返回一個(gè)接口應(yīng)該被認(rèn)為是特殊的事情。
返回接口類型的錯(cuò)誤error就是其中之一。
返回表示未導(dǎo)出類型的接口是另一個(gè)例外。但是為什么要有一個(gè)描述未導(dǎo)出結(jié)構(gòu)的導(dǎo)出接口,而不是僅僅有一個(gè)導(dǎo)出結(jié)構(gòu)呢?
原因很簡(jiǎn)單,這允許您更好地控制該結(jié)構(gòu)的構(gòu)造方式。
比較這兩段代碼:
type MyType struct {
MyField string
}
func NewMyType(value string) MyType {
return MyType{value}
}
func (t MyType) MyMethod() string {
return t.MyField
}
type MyType interface {
MyMethod() string
}
type myType struct {
MyField string
}
func NewMyType(value string) MyType {
return myType{value}
}
func (t myType) MyMethod() string {
return t.MyField
}
在第一種情況下,我可以這樣做:myVar := MyType{}而在第二種情況下,我將無法這樣做,我被迫使用提供的構(gòu)造函數(shù)。第一種情況還允許在創(chuàng)建后修改字段值,而第二種情況則不允許。使該字段不導(dǎo)出將解決第二部分,但不能解決第一部分。
這個(gè)例子顯然是微不足道的,但是能夠構(gòu)造無效的結(jié)構(gòu)可能會(huì)產(chǎn)生可怕的影響。通過使用特定的構(gòu)造函數(shù),您可以確保對(duì)象處于有效的起始狀態(tài),并且您只需要確保它始終保持有效狀態(tài)。如果您不能確保這一點(diǎn),您可能需要在每個(gè)方法開始時(shí)檢查它是否處于有效狀態(tài)。
例如,考慮一個(gè)數(shù)據(jù)庫(kù)請(qǐng)求。它需要數(shù)據(jù)庫(kù)連接。如果用戶能夠在沒有數(shù)據(jù)庫(kù)連接的情況下創(chuàng)建數(shù)據(jù)庫(kù)請(qǐng)求,您將必須檢查它在每種方法中是否有效。如果你強(qiáng)迫他使用構(gòu)造函數(shù),你可以在創(chuàng)建時(shí)檢查并完成。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
這在一定程度上取決于您的偏好以及您如何看待事物。來自 OOP 背景的我的看法是:如果不能強(qiáng)制執(zhí)行構(gòu)造函數(shù),那么構(gòu)造函數(shù)就沒有任何意義。添加構(gòu)造函數(shù)意味著 - 您必須在實(shí)例化此項(xiàng)時(shí)提供這些值。如果您的結(jié)構(gòu)是公共的,它將被濫用并繞過構(gòu)造函數(shù)進(jìn)行實(shí)例化。因此,構(gòu)造函數(shù)返回公共接口并且結(jié)構(gòu)是私有的(小寫)是有意義的。如果結(jié)構(gòu)是公共的,則構(gòu)造函數(shù)中沒有任何意義,因?yàn)槟鸁o法強(qiáng)制執(zhí)行它。編寫代碼是作者和讀者之間的對(duì)話,將結(jié)構(gòu)公開并擁有構(gòu)造函數(shù)會(huì)告訴讀者 - 這里你有構(gòu)造函數(shù),但你也有一個(gè)公共結(jié)構(gòu),這意味著構(gòu)造函數(shù)的使用是任意的。如果是這種情況,請(qǐng)采用該設(shè)置

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
在大多數(shù)情況下,構(gòu)造函數(shù)返回具體類型(或指向類型的指針)。返回接口可能是一個(gè)好主意的情況是當(dāng)調(diào)用工廠函數(shù)或構(gòu)建器函數(shù)時(shí),其中底層具體類型滿足該接口。
error
例如,考慮接口,當(dāng)你調(diào)用http.NewRequest
底層集中錯(cuò)誤類型可以是 of等net.Error
。net.DNSError
現(xiàn)在嘗試思考如果函數(shù)返回具體類型,你將如何在沒有接口的情況下創(chuàng)建這樣的 api error
?我能想到的唯一解決方案是為net
包創(chuàng)建一個(gè)巨大的錯(cuò)誤類型并添加額外信息的字段,但它很可能更難以維護(hù),測(cè)試這種錯(cuò)誤類型,更不用說內(nèi)存膨脹了。
無論您選擇返回具體類型還是接口都是設(shè)計(jì)選擇,都存在一些準(zhǔn)則來為常見場(chǎng)景提供解決方案。
- 3 回答
- 0 關(guān)注
- 159 瀏覽
添加回答
舉報(bào)