«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > ## Как преобразовать фрагмент интерфейса в совместимый фрагмент интерфейса в Go?

## Как преобразовать фрагмент интерфейса в совместимый фрагмент интерфейса в Go?

Опубликовано 2 ноября 2024 г.
Просматривать:992

## How to Convert a Slice of Interfaces to a Compatible Interface Slice in Go?

Преобразование фрагментов интерфейсов в совместимые фрагменты интерфейса

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