Замена нескольких строк в Golang с помощью Replacer
Замены строк в Golang очень просты с помощью пакета strings. Из документации: «Пакет stings
реализуют простые функции для управления строками в кодировке UTF-8». Возьмите следующее предложение:
"Hello World!"
Теперь предположим, что мой владелец продукта считает, что сказать «Hello World» с восклицательным знаком — мне нужно заменить !
на .
что очень легко сделать в Golang:
myString := "Hello World!"
myString = strings.ReplaceAll(myString, "!", ".")
fmt.Println(myString)
Результатом будет Hello World.
. Как видите, использование strings.ReplaceAll
очень простое:
- Укажите строку, с которой вы хотите работать
- Укажите символ для замены
- Укажите на какой символ заменять
И теперь вы знаете, как заменить строку в Golang, поздравляю! Примечание: также есть метод strings.Replace, где вы можете контролировать, сколько раз замена выполняется в вашей строке.
Когда это не так просто
Замена — это здорово, но что, если ваша строка выглядит примерно так:
"Hello_World!_This.sentence.has_chars_I.want_to.remove!"
Наш владелец продукта говорит, что это предложение не будет работать, и нам нужно заменить _
и .
пробелом. Теперь, когда мы знаем, как использовать strings.ReplaceAll
, мы можем легко сделать что-то вроде этого:
myString := "Hello_World!_This.sentence.has_chars_I.want_to.remove!"
myString = strings.ReplaceAll(myString, "_", " ")
myString = strings.ReplaceAll(myString, ".", " ")
fmt.Println(myString)
Результатом будет Hello World! This sentence has chars I want to remove!
. В этом примере у нас все еще есть довольно простое предложение с двумя разными символами для замены. Это не так уж плохо, и мы можем довольно легко достичь нашей цели, используя дважды strings.ReplaceAll
.
Но что, если нам нужно заменить 5 символов, или 10, или 20? У нас может быть 20 операторов strings.ReplaceAll
, и это будет работать нормально, но это громоздко. Или что, если мне нужно выполнить эту замену в нескольких функциях? Это может быстро превратиться в беспорядок. Давайте посмотрим на лучший способ.
Использование Replacer
В пакет strings
входит метод strings.Replacer. Из документации: «Replacer заменяет список строк заменами. Это безопасно для одновременного использования несколькими горутинами». По сути, вы можете указать список замен, которые нужно выполнить, а затем выполнить их все сразу для вашей целевой строки:
myString := "Hello_World!_This.sentence.has_chars_I.want_to.remove!"
replacer := strings.NewReplacer("_", " ", ".", " ")
myString = replacer.Replace(myString)
fmt.Println(myString)
Результатом будет Hello World! This sentence has chars I want to remove!
. Использование функции Replacer также очень просто:
- Создайте новый Replacer со всеми символами, которые вы хотите заменить
- Примените его к своей строке
В этом примере это не сэкономило нам ни одной строки кода, но ничего страшного, это простой пример. Но это настраивает нас на гораздо более сложные сценарии, такие как:
- Необходимо заменить 5, 10, 20 разных символов
- Необходимость передать заменитель любой функции, которая должна выполнять точно такие же замены