mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-07 06:59:59 +08:00
perf(core/stringx): replace manual char filter with strings.Map (#5453)
Co-authored-by: 1911860538 <alxps1911@gmail.com>
This commit is contained in:
@@ -3,6 +3,7 @@ package stringx
|
||||
import (
|
||||
"errors"
|
||||
"slices"
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/lang"
|
||||
@@ -21,20 +22,14 @@ func Contains(list []string, str string) bool {
|
||||
return slices.Contains(list, str)
|
||||
}
|
||||
|
||||
// Filter filters chars from s with given filter function.
|
||||
func Filter(s string, filter func(r rune) bool) string {
|
||||
var n int
|
||||
chars := []rune(s)
|
||||
for i, x := range chars {
|
||||
if n < i {
|
||||
chars[n] = x
|
||||
// Filter filters chars from s with given remove function.
|
||||
func Filter(s string, remove func(r rune) bool) string {
|
||||
return strings.Map(func(r rune) rune {
|
||||
if remove(r) {
|
||||
return -1
|
||||
}
|
||||
if !filter(x) {
|
||||
n++
|
||||
}
|
||||
}
|
||||
|
||||
return string(chars[:n])
|
||||
return r
|
||||
}, s)
|
||||
}
|
||||
|
||||
// FirstN returns first n runes from s.
|
||||
|
||||
@@ -92,6 +92,24 @@ func TestFilter(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkFilter(b *testing.B) {
|
||||
b.Run("true", func(b *testing.B) {
|
||||
b.ResetTimer()
|
||||
b.ReportAllocs()
|
||||
for i := 0; i < b.N; i++ {
|
||||
Filter(`ab,cd,ef`, func(r rune) bool { return r == ',' })
|
||||
}
|
||||
})
|
||||
|
||||
b.Run("false", func(b *testing.B) {
|
||||
b.ResetTimer()
|
||||
b.ReportAllocs()
|
||||
for i := 0; i < b.N; i++ {
|
||||
Filter(`ab,cd,ef`, func(r rune) bool { return r == '!' })
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestFirstN(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
|
||||
Reference in New Issue
Block a user