Каков самый быстрый способ удалить все пробелы из некоторой произвольной строки в Go.
Я связываю две функции из пакета строк:
response = strings.Join(strings.Fields(response),"")
У кого-нибудь есть лучший способ сделать это?
Каков самый быстрый способ удалить все пробелы из некоторой произвольной строки в Go.
Я связываю две функции из пакета строк:
response = strings.Join(strings.Fields(response),"")
У кого-нибудь есть лучший способ сделать это?
Вот несколько тестов для нескольких различных методов удаления всех пробельных символов из строки: (исходные данные):
BenchmarkSpaceMap-8 2000 1100084 ns/op 221187 B/op 2 allocs/op BenchmarkSpaceFieldsJoin-8 1000 2235073 ns/op 2299520 B/op 20 allocs/op BenchmarkSpaceStringsBuilder-8 2000 932298 ns/op 122880 B/op 1 allocs/op
SpaceMap
: использует strings.Map
; постепенно увеличивается количество выделенного пространства, так как встречается больше непробельных символовSpaceFieldsJoin
: strings.Fields
и strings.Join
; генерирует много промежуточных данныхSpaceStringsBuilder
использует strings.Builder
; выполняет одиночное распределение, но может сильно перераспределить, если исходная строка в основном является пробелом.package main_test
import (
"strings"
"unicode"
"testing"
)
func SpaceMap(str string) string {
return strings.Map(func(r rune) rune {
if unicode.IsSpace(r) {
return -1
}
return r
}, str)
}
func SpaceFieldsJoin(str string) string {
return strings.Join(strings.Fields(str), "")
}
func SpaceStringsBuilder(str string) string {
var b strings.Builder
b.Grow(len(str))
for _, ch := range str {
if !unicode.IsSpace(ch) {
b.WriteRune(ch)
}
}
return b.String()
}
func BenchmarkSpaceMap(b *testing.B) {
for n := 0; n < b.N; n++ {
SpaceMap(data)
}
}
func BenchmarkSpaceFieldsJoin(b *testing.B) {
for n := 0; n < b.N; n++ {
SpaceFieldsJoin(data)
}
}
func BenchmarkSpaceStringsBuilder(b *testing.B) {
for n := 0; n < b.N; n++ {
SpaceStringsBuilder(data)
}
}
Я нашел, что самый простой способ - использовать строки. Замените так:
randomString := " hello this is a test"
fmt.Println(strings.Replace(randomString, " ", "", -1))
>hellothisisatest
Из rosettacode.org:
Вы можете найти такую функцию:
func stripChars(str, chr string) string {
return strings.Map(func(r rune) rune {
if strings.IndexRune(chr, r) < 0 {
return r
}
return -1
}, str)
}
Итак, просто заменить chr
на " "
здесь должно быть достаточно, чтобы сделать трюк и удалить пробелы.
Помните, что существуют другие типы пробелов, определенные в unicode (например, разрыв строки, nbsp,...), и вы также можете избавиться от них (особенно если вы работаете с внешними данными, действительно имеют контроль)
Это будет сделано следующим образом:
func stripSpaces(str string) string {
return strings.Map(func(r rune) rune {
if unicode.IsSpace(r) {
// if the character is a space, drop it
return -1
}
// else keep it in the string
return r
}, str)
}
Затем просто примените к своей строке. Надеюсь, он работает, не тестировал.