Am effizientesten ist es wahrscheinlich, über das Slice zu iterieren und es anzuhängen, wenn Sie es nicht finden.
func AppendIfMissing(slice []int, i int) []int {
for _, ele := range slice {
if ele == i {
return slice
}
}
return append(slice, i)
}
Es ist einfach und offensichtlich und wird für kleine Listen schnell sein.
Außerdem ist es immer schneller als Ihre aktuelle kartenbasierte Lösung. Die kartenbasierte Lösung iteriert über das gesamte Segment, egal was passiert. Diese Lösung wird sofort zurückgegeben, wenn festgestellt wird, dass der neue Wert bereits vorhanden ist. Beide Lösungen vergleichen Elemente, während sie iterieren. (Jede Kartenzuweisungsanweisung führt sicherlich intern mindestens einen Kartenschlüsselvergleich durch.) Eine Karte wäre nur dann nützlich, wenn Sie sie über viele Einfügungen hinweg pflegen könnten. Wenn Sie es bei jeder Einfügung neu erstellen, gehen alle Vorteile verloren.
Wenn Sie wirklich große Listen effizient bearbeiten müssen, sollten Sie die Listen in sortierter Reihenfolge verwalten. (Ich vermute, die Reihenfolge spielt für Sie keine Rolle, da Ihre erste Lösung am Anfang der Liste und Ihre neueste Lösung am Ende angehängt wird.) Wenn Sie die Listen immer sortiert halten, können Sie die Funktion sort.Search verwenden Führen Sie effiziente binäre Einfügungen durch.