第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何編寫慣用的構(gòu)造函數(shù)

如何編寫慣用的構(gòu)造函數(shù)

Go
明月笑刀無情 2023-08-07 14:47:27
我對(duì) Go 中的構(gòu)造函數(shù)感到困惑。我見過的大多數(shù)構(gòu)造函數(shù)都會(huì)返回一個(gè)結(jié)構(gòu)體,但是“Effective Go”表明,根據(jù)“通用性”規(guī)則,在某些情況下可以返回一個(gè)接口。我相信“Effective Go”能夠提供好的想法,但這似乎不遵循“接受接口,返回結(jié)構(gòu)”的原則。我猜想許多類型都實(shí)現(xiàn)了一個(gè)接口,僅此而已,因此在這種情況下,很容易看到返回接口的構(gòu)造函數(shù)。另一個(gè)相關(guān)的說法是接口應(yīng)該由消費(fèi)者定義,但“通用性”意味著接口由生產(chǎn)者定義。有人可以澄清一下嗎?
查看完整描述

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í)檢查并完成。


查看完整回答
反對(duì) 回復(fù) 2023-08-07
?
30秒到達(dá)戰(zhàn)場(chǎng)

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è)置



查看完整回答
反對(duì) 回復(fù) 2023-08-07
?
子衿沉夜

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)景提供解決方案。


查看完整回答
反對(duì) 回復(fù) 2023-08-07
  • 3 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)