从Go中的任意字符串中删除所有空格的最快方法是什么。
我从字符串包中链接了两个函数:
response = strings.Join(strings.Fields(response),"")
任何人都有更好的方法吗?
答案 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
;随着遇到更多的非空白字符,逐渐增加分配的空间量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)
}
}
答案 1 :(得分:29)
我发现最简单的方法是使用strings.Replace,如下所示:
randomString := " hello this is a test"
fmt.Println(strings.Replace(randomString, " ", "", -1))
>hellothisisatest
答案 2 :(得分:1)
你可以找到这种功能:
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)
}
然后只需应用于您的字符串。希望它有效,没有测试。