我正在學(xué)習(xí) Go,并想知道在某些情況下,在 Golang 中根據(jù)消費(fèi)者代碼將如何處理該結(jié)構(gòu)來創(chuàng)建多個(gè)interface變體是否被認(rèn)為是好的/好的/典型的(鼓勵(lì)?)實(shí)踐?struct我對此表示懷疑,因?yàn)槲矣幸粋€(gè)結(jié)構(gòu)對象,可以說它在我的代碼庫中做了太多事情,并且我想添加一些測試并僅模擬該結(jié)構(gòu)的某些用法/使用者。說我有,對于(人為的)示例,環(huán)境結(jié)構(gòu)// Environment/env.gopackage envtype Environment struct { sunny bool, fullMoon bool, temp float64 // ...}func (e *Environment) IsSunny() bool { return e.sunny}func (e *Environment) IsFullMoon() bool { return e.fullMoon}func (e *Environment) GetTemp() float64 { return e.temp}上面的結(jié)構(gòu)體具有與一些環(huán)境條件(白天和夜間)相關(guān)的屬性和方法。然后這個(gè)結(jié)構(gòu)有多個(gè)消費(fèi)者,但每個(gè)消費(fèi)者interface只關(guān)心可用方法的子集:// daytime.gotype DayEnv interface { IsSunny() bool GetTemp() float64}func getDaytime(de DayEnv) { sunStatus := getSunStatus(de) temp := getDayTemp(de) fmt.Printf("Today is %s and temperature is %s", sunStatus, temp)}// func getSunStatus(de DayEnv) string {}// func getDayTemp(de DayEnv) string {}// nightTime.gotype NightEnv interface { IsFullMoon() bool GetTemp() float64}func getNighttime(ne NightEnv) { moonPhase := getMoonPhase(ne) temp := getNightTemp(ne) fmt.Printf("Tonight the moon is %s and temperature is %s", moonPhase, temp)}// func getMoonPhase(ne NightEnv) string { }// func getNightTemp(ne NightEnv) string { }在我看來,雖然創(chuàng)建一個(gè)只關(guān)心結(jié)構(gòu)方法子集的新接口使事情變得更加靈活,但擁有如此多(部分)接口重復(fù)并根據(jù)需要或在任何地方散布它們也感覺相當(dāng)懶惰或錯(cuò)誤他們被消耗了。我意識到這個(gè)例子有點(diǎn)做作,但是在更大的范圍內(nèi)(就像很多很多消費(fèi)者),或者也許一個(gè)文件具有x相同結(jié)構(gòu)的接口......這種方法有什么問題嗎?
2 回答

牛魔王的故事
TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊
這種方法沒有什么問題,Go 標(biāo)準(zhǔn)庫也經(jīng)常使用它。例如,有許多結(jié)構(gòu)體實(shí)現(xiàn)了 io.Reader、io.Writer、io.Closer 和 io.Seeker 的組合。這些結(jié)構(gòu)的用戶指定他們需要什么類型的接口并使用它。

胡子哥哥
TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
接口是golang實(shí)現(xiàn)“多態(tài)”的必備部分。你不但做對了,還找到了界面的本質(zhì)。
- 2 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報(bào)
0/150
提交
取消