replace strings.Split(N) for strings.Cut() or alternatives
Go 1.18 and up now provides a strings.Cut() which is better suited for
splitting key/value pairs (and similar constructs), and performs better:
```go
func BenchmarkSplit(b *testing.B) {
b.ReportAllocs()
data := []string{"12hello=world", "12hello=", "12=hello", "12hello"}
for i := 0; i < b.N; i++ {
for _, s := range data {
_ = strings.SplitN(s, "=", 2)[0]
}
}
}
func BenchmarkCut(b *testing.B) {
b.ReportAllocs()
data := []string{"12hello=world", "12hello=", "12=hello", "12hello"}
for i := 0; i < b.N; i++ {
for _, s := range data {
_, _, _ = strings.Cut(s, "=")
}
}
}
```
BenchmarkSplit
BenchmarkSplit-10 8244206 128.0 ns/op 128 B/op 4 allocs/op
BenchmarkCut
BenchmarkCut-10 54411998 21.80 ns/op 0 B/op 0 allocs/op
While looking at occurrences of `strings.Split()`, I also updated some for alternatives,
or added some constraints; for cases where an specific number of items is expected, I used `strings.SplitN()`
with a suitable limit. This prevents (theoretical) unlimited splits.
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
@@ -230,13 +230,10 @@ func ObjectWithLabelArgs(clicontext *cli.Context) (string, map[string]string) {
|
||||
func LabelArgs(labelStrings []string) map[string]string {
|
||||
labels := make(map[string]string, len(labelStrings))
|
||||
for _, label := range labelStrings {
|
||||
parts := strings.SplitN(label, "=", 2)
|
||||
key := parts[0]
|
||||
value := "true"
|
||||
if len(parts) > 1 {
|
||||
value = parts[1]
|
||||
key, value, ok := strings.Cut(label, "=")
|
||||
if !ok {
|
||||
value = "true"
|
||||
}
|
||||
|
||||
labels[key] = value
|
||||
}
|
||||
|
||||
@@ -247,11 +244,11 @@ func LabelArgs(labelStrings []string) map[string]string {
|
||||
func AnnotationArgs(annoStrings []string) (map[string]string, error) {
|
||||
annotations := make(map[string]string, len(annoStrings))
|
||||
for _, anno := range annoStrings {
|
||||
parts := strings.SplitN(anno, "=", 2)
|
||||
if len(parts) != 2 {
|
||||
key, value, ok := strings.Cut(anno, "=")
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("invalid key=value format annotation: %v", anno)
|
||||
}
|
||||
annotations[parts[0]] = parts[1]
|
||||
annotations[key] = value
|
||||
}
|
||||
return annotations, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user