从字符串中删除所有空格

Omn*_*Omn 25 go

从Go中的某个任意字符串中删除所有空格的最快方法是什么.

我从字符串包中链接了两个函数:

response = strings.Join(strings.Fields(response),"")
Run Code Online (Sandbox Code Playgroud)

谁有更好的方法来做到这一点?

Tim*_*per 51

以下是从字符串中剥离所有空白字符的几种不同方法的一些基准:( 源数据):

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.Fieldsstrings.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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Dat*_*sik 34

我发现最简单的方法是使用strings.Replace如下:

randomString := "  hello      this is a test"
fmt.Println(strings.Replace(randomString, " ", "", -1))

>hellothisisatest
Run Code Online (Sandbox Code Playgroud)

操场

  • 这不会剥离其他空格,例如换行符和制表符。 (3认同)
  • 这不能正确回答问题.我不是在寻找"最简单"的方法来删除空格.我一直在寻找删除所有空格的最快的通用方法. (2认同)
  • stringvar = strings.Replace(randomString,"","", - 1) (2认同)