2016-02-16 5 views
3

Может кто-нибудь объяснить, почему утиная печать не работает, когда срез передается в вариационную функцию.
Случаи 1 и 2, как указано ниже, работают, но case-3 ниже инициализирует срез, а затем передает разделяемый фрагмент функции, которая принимает интерфейс.проблема с интерфейсами и типами

Сообщение об ошибке: cannot use gophers (type []Gopher) as type []Animal in argument to runForest

package main 

    import (
     "fmt" 
    ) 

    type Animal interface { 
     Run() string 
    } 

    type Gopher struct { 
    } 

    func (g Gopher) Run() string { 
     return "Waddle.. Waddle" 
    } 

    func runForest(animals ...Animal) { 
     for _, animal := range animals { 
      fmt.Println(animal.Run()) 
     } 
    } 

    func main() { 

     //works 
     runForest(Gopher{}) 

     //works 
     runForest(Gopher{},Gopher{}) 

     // does not work 
     gophers := []Gopher{{},{}} 
     runForest(gophers...) 
    } 
+5

См https://golang.org/doc/faq#convert_slice_of_interface – Volker

ответ

2

Как Volker упоминает в комментариях, ломтики не могут быть неявно преобразован способом их элементы могут. A Gopher может сделать так же, как Animal, но []Gopher не может уклониться, как []Animal.

Минимальное изменение, чтобы получить эту работу является:

func main() { 
    gophers := []Gopher{{}, {}} 
    out := make([]Animal, len(gophers)) 
    for i, val := range gophers { 
     out[i] = Animal(val) 
    } 
    runForest(out...) 
}