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?
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