strings: improve explode and correct comment

Merges explodetests into splittests which already contain
some of the tests that cover explode.

Adds a test to cover the utf8.RuneError branch in explode.

name      old time/op  new time/op  delta
Split1-2  14.9ms ± 0%  14.2ms ± 0%  -4.06%  (p=0.000 n=47+49)

Change-Id: I00f796bd2edab70e926ea9e65439d820c6a28254
Reviewed-on: https://go-review.googlesource.com/21609
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Martin Möhrmann 2016-03-26 00:04:48 +01:00 committed by Ian Lance Taylor
parent 3f66d8c84b
commit 819e0b29bb
2 changed files with 18 additions and 46 deletions

View file

@ -12,32 +12,25 @@ import (
"unicode/utf8"
)
// explode splits s into an array of UTF-8 sequences, one per Unicode character (still strings) up to a maximum of n (n < 0 means no limit).
// Invalid UTF-8 sequences become correct encodings of U+FFF8.
// explode splits s into a slice of UTF-8 strings,
// one string per Unicode character up to a maximum of n (n < 0 means no limit).
// Invalid UTF-8 sequences become correct encodings of U+FFFD.
func explode(s string, n int) []string {
if n == 0 {
return nil
}
l := utf8.RuneCountInString(s)
if n <= 0 || n > l {
if n < 0 || n > l {
n = l
}
a := make([]string, n)
var size int
var ch rune
i, cur := 0, 0
for ; i+1 < n; i++ {
ch, size = utf8.DecodeRuneInString(s[cur:])
for i := 0; i < n-1; i++ {
ch, size := utf8.DecodeRuneInString(s)
a[i] = s[:size]
s = s[size:]
if ch == utf8.RuneError {
a[i] = string(utf8.RuneError)
} else {
a[i] = s[cur : cur+size]
}
cur += size
}
// add the rest, if there is any
if cur < len(s) {
a[i] = s[cur:]
if n > 0 {
a[n-1] = s
}
return a
}