Как я могу реализовать интерфейс для объединения 2 (или более) типов? - PullRequest
0 голосов
/ 03 февраля 2019

Чтобы быть более конкретным:

У меня есть 2 читателя.Один из них я получаю из os.Open («someExistingFile»), а другой - из strings.NewReader («hello world»).

Один из них реализует Name (), а другой - нет.Я хочу, чтобы другой также реализовывал Name () (например, возвращая "") или (предпочтительно) вызывал только Name (), если тип фактического параметра это поддерживает.

Надеюсь, фрагмент кода ниже ясно показывает, что я хочу решить.

Я играл с разными приемниками, даже с отражением, но я не дошел до сути ...

package main

import (
    "io"
    "os"
    "strings"
)

func main() {
    stringReader := strings.NewReader("hello world")
    fileReader, _ := os.Open("someExistingFile") // error handling omitted
    fileReader.Name()

    printFilenameIfReaderIsFile(stringReader)
    printFilenameIfReaderIsFile(fileReader)
}

func printFilenameIfReaderIsFile(reader io.Reader) {
    // here I want to ...
    // ... either check if this reader is of type os.File and in this case call its Name() method (preferred)
    // ... or use a custom type instead of io.Reader.
    //     This type's Name() method should return the filename for fileReader and nil for stringReader.
}

1 Ответ

0 голосов
/ 03 февраля 2019

Вам нужна структура управления .

Ваша printFilenameIfReaderIsFile функция должна выглядеть (не проверено):

func printFilenameIfReaderIsFile(reader io.Reader) {
  switch f := reader.(type) {
    case *os.File:
      // f is now *os.File (not a os.File!)
      fmt.Printf("%s\n", f.Name())
  }
}

РЕДАКТИРОВАТЬ: Не забывайте, что os.Open возвращает *os.File вместо os.File см. Документы !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...