2013-04-09 6 views
9

Mam konkretny obiekt struktury języka, który wchodzę w interakcje i oczekuję, że będzie równy samemu sobie. Jestem przekazując funkcję do funkcji, które po prostu zwraca go jednak, że robi to przyjmując interfejs {} wejść/wyjśćBłąd typu nieporównywalny, gdy użyto pola łańcuchowego [] (Go lang)

type Animal struct { 
    name string 
    food interface{} 
} 

type YummyFood { 
    calories int 
} 

func echo_back(input interface{}) interface{} { 
    return input 
} 

func main() { 
    var tiger_food = Food{calories: 1000} 
    var tiger = Animal{name: "Larry", food: tiger_food} 
    output_tiger := echo_back(tiger) 

    fmt.Printf("%T, %+v\n", tiger, tiger) 
    fmt.Printf("%T, %+v\n", output_tiger, output_tiger) 
    fmt.Println(tiger == output_tiger) 
    fmt.Println(tiger == output_tiger.(Animal)) 

} 

Running to widać, że tygrys i output_tiger wydają się być takie same, a do oceny być równym. Wspaniały. Tego bym się spodziewał. TERAZ, spróbuj użyć tej definicji dla YummyFood

type YummyFood { 
    calories int 
    ingredients []string 
} 

Nagle, wyjście z echo_back nie ocenia się być taka sama, jak na wejściu, nawet typu twierdzenia. Otrzymuję komunikat "panika: błąd wykonania: porównywanie nieporównywalnego typu YummyFood"

Pytanie, dlaczego dodanie typu łańcucha [] powoduje, że dane wejściowe i wyjściowe są nieporównywalne? Jak mogę zmodyfikować output_tiger, aby odzyskać to samo, co wstawiłem (tj. Oczekuję, że będzie taki sam jak "tygrys"). Jak odzwierciedlić output_tiger, aby był równy tygrysowi?

Odpowiedz

8

Plastry ([]string) nie ma zdefiniowanej równości. Tablice i struktury zawierające elementy o zdefiniowanej równości będą miały zdefiniowaną równość.

Note that equality is still undefined for slices, for which the calculation is in general infeasible. Also note that the ordered comparison operators (< <= > >=) are still undefined for structs and arrays.

Od http://golang.org/doc/go1.html#equality

+0

Co sprawia, że ​​plasterki Go różnią się od niezliczonych innych tablic dynamicznych w innych językach, dla których istnieją operatory równości? Kontenery C++ STL mają operatory równości, Java, JS, lista jest długa. Po prostu ciekawi mnie, dlaczego projektanci Go zdecydowali się nie rozwiązywać problemu, który wydaje się doskonale rozwiązywalny. – iamtheddrman

8

To nie będzie szybki, ale można użyć reflect.DeepEqual() porównać plastry (lub po prostu YummyFood). Wykonuje pętlę, aby porównać wszystkie elementy. Prawdopodobnie mógłbyś wykonać bardziej wydajną funkcję, ale jeśli ten, który tam jest, jest wystarczająco szybki, zaoszczędzisz sobie trochę pracy i może trochę błędów. :-)

Powiązane problemy