Преобразование фрагментов интерфейсов в совместимые фрагменты интерфейса
Реализация различных интерфейсов, содержащих перекрывающиеся методы, может обеспечить гибкость в программировании. Однако передача фрагмента одного интерфейса функции, ожидающей другой, но совместимый интерфейс, может привести к ошибкам. Давайте рассмотрим, как решить эту проблему в 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