@svd222

Package zip golang. Можно ли в структурах «опускать» часть пути к полю?

Помогите понять код

тут https://golang.org/pkg/archive/zip/#Reader Для структуры Reader ниже дан пример.

// Open a zip archive for reading.
    r, err := zip.OpenReader("testdata/readme.zip")
    if err != nil {
            log.Fatal(err)
    }
    defer r.Close()

    // Iterate through the files in the archive,
    // printing some of their contents.
    for _, f := range r.File {
            fmt.Printf("Contents of %s:\n", f.Name)
            rc, err := f.Open()
            if err != nil {
                    log.Fatal(err)
            }
            _, err = io.CopyN(os.Stdout, rc, 68)
            if err != nil {
                    log.Fatal(err)
            }
            rc.Close()
            fmt.Println()
    }


но метод OpenReader возвращает структуру ReadCloser а не Reader, которая в свою очередь не имеет поля File []*zip.File (Reader имеет). Также в сорцах https://golang.org/src/archive/zip/reader.go?s=583...
она объявлена как
type ReadCloser struct {
    f *os.File
    Reader
}
,
тогда почему
r, err := zip.OpenReader("testdata/readme.zip") 

fmt.Printf("%T",r.Reader.File)
fmt.Println("");
fmt.Printf("%T",r.File)
fmt.Println("");


дают одинаковый результат? А именно:
[]*zip.File
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Поле Reader в структуре ReadCloser называется в Go безымянным или внедренным (embedded) полем, объявлен только его тип но не имя. Материнская структура может пользоваться полями и методами внедренной напрямую без квалификаторов имени r.File, однако при надобности название типа можно использовать как квалификатор r.Reader.File. С именованными полями фокус не работает.
type ReadCloser struct {
    f *os.File   //именованное поле f -имя *os.File -тип
    Reader     //внедренное поле Reader -тип имени нет
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
28 нояб. 2024, в 13:00
70000 руб./за проект
28 нояб. 2024, в 12:59
30000 руб./за проект
28 нояб. 2024, в 12:58
5000 руб./за проект