Подтвердить что ты не робот

Стрите все пробелы из строки

Каков самый быстрый способ удалить все пробелы из некоторой произвольной строки в Go.

Я связываю две функции из пакета строк:

response = strings.Join(strings.Fields(response),"")

У кого-нибудь есть лучший способ сделать это?

4b9b3361

Ответ 1

Вот несколько тестов для нескольких различных методов удаления всех пробельных символов из строки: (исходные данные):

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)
    }
}

Ответ 3

Из 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)
}

Затем просто примените к своей строке. Надеюсь, он работает, не тестировал.