Ich habe ein bestimmtes Go lang Struct-Objekt, mit dem ich interagiere, und ich erwarte, dass es sich selbst gleicht. Ich bin die Funktion an eine Funktion, die es einfach zurückgibt, aber das tut es durch die Schnittstelle zu akzeptieren {} Ein-/AusgängeUnvergleichbar Typ Fehler, wenn [] Zeichenfolge Feld verwendet (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))
}
dieses Rennen, sehen Sie, dass der Tiger und output_tiger scheinen die gleichen zu sein und bewerten zu gleich sein. Groß. Das würde ich erwarten. Nun versuchen Sie, diese Definition verwendet für YummyFood
type YummyFood {
calories int
ingredients []string
}
ganz plötzlich, ist die Ausgabe von echo_back nicht die gleichen wie der Eingang zu bewerten, auch mit der Art Behauptung. Ich bekomme 'Panik: Laufzeitfehler: Vergleichen unvergleichbar Typ YummyFood'
Die Frage ist, warum die Zugabe der [] String-Typ die Eingabe und Ausgabe zu sein unvergleichbar? Wie kann ich output_tiger so ändern, dass ich dasselbe zurückbekomme, wie ich es eingegeben habe (d. H. Ich erwarte, dass es dasselbe ist wie "tiger"). Wie reflektiere ich output_tiger, um es Tiger gleich zu machen?
Was unterscheidet Go Slices von den unzähligen anderen dynamischen Arrays in anderen Sprachen, für die es Gleichheitsoperatoren gibt? C++ STL-Container haben Gleichheitsoperatoren, Java, JS, die Liste geht weiter. Ich bin nur neugierig, warum die Go-Designer entschieden haben, ein Problem, das hervorragend lösbar scheint, nicht zu lösen. – iamtheddrman