2017-02-20 8 views
0

У меня есть группа *io.PipeWriter и вы хотите сделать мультивитер на основе всех этих автопилотов в функции. Поэтому я называю функцию что-то вродеПередача [] * io.PipeWriter to io.MultiWriter

func copyToWriters(reader *bufio.Reader, errs chan error, writers []*io.PipeWriter) { 
    for _, writer := range writers { 
    defer writer.Close() 
    } 
    mw := io.MultiWriter(writers) 
    _, err := io.Copy(mw, reader) 
    if err != nil { 
    errs <- err 
    } 
} 

Я называю этот метод с аргументами copyToWriters(reader, errs, []*io.PipeWriter{w1, w2})

Но это говорит cannot use writers (type []*io.PipeWriter) as type []io.Writer in argument to io.MultiWriter. Но если я меняю io.MultiWriter(writers) на io.MultiWriter(writers[0],writers[1]) это работает. Как я могу заставить существующую функцию работать, не переписывая авторов отдельно.

+0

@Volker вы можете дать причину? поскольку '* io.PipeWriter' реализует интерфейс' Writer', представляется законным использовать '* io.PipeWriter' вместо' io.PipeWriter': https://golang.org/pkg/io/#PipeWriter – ymonad

+0

почему downvote? – Vishnu

+0

A, извините, вы правы, PipeWriter не является интерфейсом. Забудь это. – Volker

ответ

4

К сожалению, система типа Golang не позволяет литья []*io.PipeWriter к []io.Writer даже когда *io.PipeWriter реализует io.Writer, поскольку он требует O (N) операций (reference).

Лучшее, что вы можете сделать, это создать еще один []io.Writer и скопировать писателям трубы в нее

И почему вы СВАО ..., читайте the document