Wie ich es verstehe, kann ich in Go keine Gleichheit für benutzerdefinierte Typen definieren. Also, was wäre die idiomatische Art der Berechnung der Anzahl von verschiedenen Objekten eines benutzerdefinierten Typs (möglicherweise rekursiv definiert). Hier ist ein Beispiel für die Art von Dingen, die ich versuche zu tun.Idiomatische Methode zum Zählen der Anzahl von unterschiedlichen Objekten des rekursiv definierten benutzerdefinierten Typs
package main
import "fmt"
type tree struct {
left *tree
right *tree
}
func shapeOf(a tree) string {
temp := "{"
if a.left != nil {
temp += shapeOf(*(a.left))
}
temp += "}{"
if a.right != nil {
temp += shapeOf(*(a.right))
}
temp += "}"
return temp;
}
func main() {
a := tree{nil, nil}
b := tree{nil, &a}
c := tree{nil, nil}
d := tree{nil, &c}
e := tree{nil, nil}
f := tree{&e, nil}
s := make(map[string]bool)
s[shapeOf(b)] = true
s[shapeOf(d)] = true
s[shapeOf(f)] = true
fmt.Println(len(s)) // As required, prints 2 because the first two trees have the same shape
}
Es funktioniert, aber die Verwendung von Strings ist extrem hässlich und wahrscheinlich auch ineffizient. Offensichtlich kann ich schreibe einfach eine rekursive Methode zu sagen, wenn zwei Bäume gleich sind - so etwas wie
func areEqual(a, b tree) bool
aber das würde mich nicht ermöglichen Bäume zu verwenden, wie Mapkeys. Was ist der idiomatische Weg, um so etwas zu tun?
Wenn Sie ein komplexes Objekt zu einem Schlüssel einer kartenähnlichen Struktur machen, benötigen Sie * * eine Hash-Funktion und eine Gleichheitsfunktion. Go stellt das nicht bereit, aber es gibt keine Möglichkeit, nur eine Funktion dafür zu schreiben. Wenn Sie jedoch etwas idiomatischer/effizienter sein wollen, dann würde ich vorschlagen, [] byte oder bytes.Buffer anstelle von Verkettungen zu verwenden. –