將介面切片轉換為相容的介面切片
實作包含重疊方法的不同介面可以提供程式彈性。但是,將一個介面的一部分傳遞給需要不同但相容的介面的函數可能會導致錯誤。讓我們探討如何在 Go 中解決這個問題。
假設我們有介面 A 和 B,其中 A 包含 B。 A 的一個實現 Impl 滿足 A 和 B。
type A interface {
Close() error
Read(b []byte) (int, error)
}
type Impl struct {}
func (I Impl) Read(b []byte) (int, error) {
fmt.Println("In read!")
return 10, nil
}
func (I Impl) Close() error {
fmt.Println("I am here!")
return nil
}
單一項目可以輕鬆地跨函數傳遞。但是,嘗試將 A 的切片傳遞給需要 io.Reader 的函數可能會失敗。
func single(r io.Reader) {
fmt.Println("in single")
}
func slice(r []io.Reader) {
fmt.Println("in slice")
}
im := &Impl{}
// works
single(im)
// FAILS!
list := []A{t}
slice(list)
要解決這個問題,我們可以建立一個 []io.Reader 類型的新切片,並用 []A 中的元素填充它。這是繞過限制並確保不同但重疊的介面類型之間的相容性的解決方法。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3