So ersetzen Sie einen Brief zu einem bestimmten index in einem string-in Gehen?
Möchte ich ersetzen einen Brief zu einem bestimmten index in einem string: aaaaaaa
-> aaabaaa
. Gibt es eine eingebaute Möglichkeit, dies zu tun? Ich schrieb die folgende Hilfsprogramm-Funktion zu verwenden, in der Zwischenzeit:
func main() {
input := "aaaaaaa"
output := replaceAtIndex(input, 'b', 3)
}
func replaceAtIndex(input string, replacement byte, index int) string {
return strings.Join([]string{input[:index], string(replacement), input[index+1:]}, "")
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Strings sind unveränderlich in zu Gehen, müssen Sie es zu konvertieren, um Runen dann modifizieren, konvertieren Sie es dann zurück in einen string.
@chendesheng die Lösung ist halb-richtig, außer Sie verwenden können
rune
stattbyte
, so wird es funktionieren auf unicode als gut.Spielplatz
Beide Antworten (OneOfOne und Denys Séguret) korrekt sind. Ich wollte nur zeigen den Unterschied in der Leistung zwischen Ihnen (das ist wirklich Auffällig, wenn der string groß ist).
Es stellt sich heraus, dass die Verwendung str[:index] + string(Ersatz) + str[index+1:] ist schneller.
Also der benchmark:
zeigt die folgende Ergebnisse (Dank Thomasz für das Auffinden einer copypasting Fehler):
Können Sie verketten von strings mit dem + - operator :
Vorsichtig sein, dass der index nicht die index von einem "Brief", aber der byte.
strings.Join
?strings.Join
Just for fun:
Nie versuchen, es zu benutzen, die irgendwo in Ihrem code.
Es ist langsamer als jede standard-Lösungen oder in oben genannten Beispielen und vieles mehr unsicher. =)
(Es ist nicht die Arbeit in Spielplatz, da
syscall
dort nicht definiert ist).Ich nahm Salvador benchmark und Hinzugefügt
strings.Join()
zu. Seine Antwort bleibt korrekt -str[:index] + string(replacement) + str[index+1:]
ist die Schnellste option für große Zeichenfolgen angenommen, Sie möchten Ihre original-string erhalten.strings.Join()
ist ziemlich nah für kleine Streicher-und sehr, sehr eng für große Zeichenfolgen. Ich habe auch tests mit noch größeren strings, um zu sehen, wennstrings.Join()
wird schneller an jedem Punkt - es scheint nicht.Ich auch, nur für funsies, gehackt zusammen mit zwei anderen Implementierungen mit
unsafe
undreflect
Musste ich auch ändern
generateString()
so würde es die größte strings erzeugen würde, in einem vernünftigen Zeitrahmen 😉Jedenfalls der code:
Und die Ergebnisse: