从字符串中删除所有空格

时间:2015-08-18 20:14:46

标签: go

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

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

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

任何人都有更好的方法吗?

3 个答案:

答案 0 :(得分:46)

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

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;随着遇到更多的非空白字符,逐渐增加分配的空间量
  • SpaceFieldsJoinstrings.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)
    }
}

答案 1 :(得分:29)

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

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

>hellothisisatest

Playground

答案 2 :(得分:1)

来自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定义了其他类型的空格(例如换行符,等等),您可能也想摆脱这些空格(特别是如果您正在处理外部数据时) #39; t真的有控制权)

这将以这种方式完成:

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

然后只需应用于您的字符串。希望它有效,没有测试。