我試圖更好地使用 Go 中的接口來描述特定的功能,并使用接口組合來編寫更好、更易于理解的代碼。我遇到了這個(gè)問題,這似乎是 go 接口的一個(gè)常見用例,但我似乎無(wú)法找出用于此應(yīng)用程序的正確語(yǔ)法。這里有一些代碼可以幫助解釋我正在嘗試做的事情:// Initializable is an interface to an object that can be initialized.type Initializable interface { Initialize() error}// InitializeAll initializes an array of members.func InitializeAll(members []Initializable) error { for _, member := range members { err := member.Initialize() if err != nil { return err } } return nil}// Host is an interface to an object providing a set of handlers for a web host.type Host interface { Initializable Hostname() string RegisterHandlers(router *mux.Router)}// ConfigureHosts configures a set of hosts and initializes them.func ConfigureHosts(hosts []Host) (*mux.Router, error) { err := InitializeAll(hosts) // compiler error here}這是錯(cuò)誤:cannot use hosts (type []Host) as type []Initializable in argument InitializeAll。我最初的想法是我缺少某種向下轉(zhuǎn)換的類型,我知道它適用于單個(gè)接口對(duì)象,但很難轉(zhuǎn)換數(shù)組。當(dāng)我嘗試做err := InitializeAll(hosts.([]Initializable))時(shí),我收到以下錯(cuò)誤:invalid type assertion: hosts.([]Initializable) (non-interface type []Host on left)。對(duì)于此代碼示例的設(shè)計(jì),我很感激任何想法,也許還有關(guān)于正確語(yǔ)法或我可以做一些重構(gòu)來解決這個(gè)問題的任何建議。謝謝!
將接口切片向下轉(zhuǎn)換為子接口切片
拉風(fēng)的咖菲貓
2022-04-26 15:50:25