2013-04-09 8 views
9

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?

Antwort

8

Slices ([]string) hat keine Gleichheit definiert. Arrays und Strukturen, die Elemente enthalten, für die die Gleichheit definiert ist, haben die Gleichheit definiert.

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.

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

+0

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

8

Es wird nicht schnell sein, aber man kann reflect.DeepEqual() verwenden, um die Scheiben (oder nur YummyFood) zu vergleichen. Es macht die Arbeit, es zu durchlaufen, um alle Elemente zu vergleichen. Sie könnten wahrscheinlich eine effizientere Funktion dafür machen, aber wenn die eine, die da ist, schnell genug ist, sparen Sie sich Arbeit und vielleicht ein paar Bugs. :-)