Wenn Sie wie ich feststellen, dass Sie im Wesentlichen denselben Sortiercode an mehr als einer Stelle wünschen oder nur die Codekomplexität gering halten möchten, können Sie die Sortierung selbst in eine separate Funktion abstrahieren, an die Sie die entsprechende Funktion übergeben die eigentliche Arbeit, die Sie möchten (die natürlich an jedem Anrufort unterschiedlich wäre).
Bei einer Karte mit Schlüsseltyp K
und Werttyp V
, dargestellt als <K>
und <V>
unten könnte die gemeinsame Sortierfunktion so etwas wie diese Vorlage Go-Code aussehen (die 1 Go - Version nicht als Service - Leistung nicht unterstützt):
/* Go apparently doesn't support/allow 'interface{}' as the value (or
/* key) of a map such that any arbitrary type can be substituted at
/* run time, so several of these nearly-identical functions might be
/* needed for different key/value type combinations. */
func sortedMap<K><T>(m map[<K>]<V>, f func(k <K>, v <V>)) {
var keys []<K>
for k, _ := range m {
keys = append(keys, k)
}
sort.Strings(keys) # or sort.Ints(keys), sort.Sort(...), etc., per <K>
for _, k := range keys {
v := m[k]
f(k, v)
}
}
Rufen Sie es dann mit der Eingabekarte und einer Funktion ( (k <K>, v <V>)
als Eingabeargumente) auf, die über die Kartenelemente in sortierter Schlüsselreihenfolge aufgerufen wird.
Eine Version des Codes in der Antwort von Mingu könnte also so aussehen:
package main
import (
"fmt"
"sort"
)
func sortedMapIntString(m map[int]string, f func(k int, v string)) {
var keys []int
for k, _ := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
f(k, m[k])
}
}
func main() {
// Create a map for processing
m := make(map[int]string)
m[1] = "a"
m[2] = "c"
m[0] = "b"
sortedMapIntString(m,
func(k int, v string) { fmt.Println("Key:", k, "Value:", v) })
}
Die sortedMapIntString()
Funktion kann für jede wiederverwendet werden map[int]string
(vorausgesetzt, die gleiche Sortierreihenfolge ist erwünscht), wobei jede Verwendung auf nur zwei Codezeilen beschränkt bleibt.
Nachteile sind:
- Es ist schwieriger zu lesen für Leute, die nicht daran gewöhnt sind, Funktionen als erstklassig zu nutzen
- Es könnte langsamer sein (ich habe keine Leistungsvergleiche durchgeführt)
Andere Sprachen haben verschiedene Lösungen:
- Wenn die Verwendung von
<K>
und <V>
(um Typen für den Schlüssel und den Wert zu bezeichnen) ein wenig vertraut erscheint, unterscheidet sich diese Codevorlage nicht wesentlich von C ++ - Vorlagen.
- Clojure und andere Sprachen unterstützen sortierte Karten als grundlegende Datentypen.
- Obwohl ich nicht weiß, wie Go
range
einen erstklassigen Typ so erstellt, dass er durch einen benutzerdefinierten Typ ersetzt werden kann ordered-range
(anstelle des range
ursprünglichen Codes), denke ich, dass einige andere Sprachen Iteratoren bereitstellen, die leistungsfähig genug sind, um dasselbe zu erreichen Ding.