2015-03-31 7 views
2

Предположим, что у меня есть массив элементов, которые реализуют интерфейс Reader:Цикл по массиву элементов, которые реализуют интерфейс

var items []Foo 

Как бы я передать эти элементы в функцию, которая принимает читателей?

func (items []Reader) { ... } 

Я не могу использовать тип []Reader, потому что я получаю такую ​​ошибку:

Cannot use type `[]Foo` as type `[]Reader`... 
+0

См https://golang.org/doc/faq#convert_slice_of_interface (и заменить '' io.Reader' для интерфейса {} 'при чтении). –

ответ

2

Например,

package main 

import (
    "bytes" 
    "io" 
) 

var items []*bytes.Buffer 

func f(items []io.Reader) {} 

func main() { 
    readers := make([]io.Reader, len(items)) 
    for i, item := range items { 
     readers[i] = item 
    } 
    f(readers) 
} 
+0

Это работает, но это означает, что я должен перебрать все элементы, прежде чем я вызову функцию. Я пытался избежать цикла. –

+2

@ VladtheImpala: поскольку они не имеют одинакового представления в памяти, необходимо скопировать элементы по отдельности. ['Могу ли я преобразовать [] T в [] интерфейс {}?'] (Https://golang.org/doc/faq#convert_slice_of_interface) – peterSO

1

Подобный ответ peterSO в.

package main 

import (
    "bytes" 
    "io" 
) 

type Foo struct{} 
type Foos []Foo 


func (f Foos) toReaders() []io.Reader { 
    readers := make([]io.Reader, len(f)) 
    for i, item := range f { 
     readers[i] = item 
    } 
    return readers 
} 

func f(items []io.Reader) {} 

func main() { 
    var x Foos 
    f(x.toReaders()) 
} 
Смежные вопросы