小编典典

删除字符串中的所有空格

go

在Go中从某个任意字符串中剥离所有空格的最快方法是什么。

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

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

有人有更好的方法吗?


阅读 280

收藏
2020-07-02

共1个答案

小编典典

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

BenchmarkSpaceMap-8 2000 1100084 ns / op 221187 B / op 2分配/ 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)
    }
    }

2020-07-02