Das Vergleichen von Strings ist möglicherweise nicht etwas, an das Sie bei der Optimierung von Software denken. Typischerweise umfasst die Optimierung Aufgaben wie das Aufteilen von Schleifen auf Goroutinen, das Finden eines schnelleren Hashing-Algorithmus oder etwas, das wissenschaftlicher klingt. Es gibt ein Erfolgserlebnis, das wir bekommen, wenn wir solche Veränderungen vornehmen. Der Stringvergleich kann jedoch oft der größte Engpass in einer Pipeline sein. Zum Beispiel wird der folgende Ausschnitt oft verwendet, aber es ist die schlechteste Lösung (Benchmarks unten) und hat echte Probleme verursacht.
strings.ToLower(name) == strings.ToLower(anderername)
Dies scheint ziemlich einfach zu sein. Wandeln Sie jede Zeichenfolge in Kleinbuchstaben um und vergleichen Sie dann. Um zu verstehen, warum dies eine schlechte Lösung ist, müssen Sie wissen, was ein String darstellt und wie `ToLower` funktioniert.
Lassen Sie uns jedoch zunächst über die wichtigsten Anwendungsfälle für Zeichenfolgenvergleiche sprechen. Beim Vergleich mit dem normalen `==`-Operator erhalten wir die schnellste und optimierteste Lösung. APIs und ähnliche Software berücksichtigen jedoch in der Regel die Groß-/Kleinschreibung. Dies ist, wenn wir `ToLower` einlegen und es Feature-Complete nennen.
In Go ist eine Zeichenfolge eine unveränderliche Abfolge von Runen. Rune ist ein Begriff, den Go verwendet, um einen Codepunkt darzustellen. Weitere Informationen zu Strings, Bytes, Runen und Zeichen finden Sie im Go-Blog. `ToLower` ist eine Standardbibliotheksfunktion, die jede Rune in einem String durchläuft, in Kleinbuchstaben umwandelt und den neu gebildeten String zurückgibt. Der obige Code durchläuft also jede Zeichenfolge vollständig vor dem Vergleich. Es ist eng an die Länge der Saiten gebunden. Hier ist ein Pseudocode, der grob die Komplexität des obigen Snippets darstellt.