diff options
Diffstat (limited to 'src/bytes')
| -rw-r--r-- | src/bytes/bytes.go | 32 |
1 files changed, 9 insertions, 23 deletions
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go index 406a38257a..a273a91911 100644 --- a/src/bytes/bytes.go +++ b/src/bytes/bytes.go @@ -49,33 +49,19 @@ func explode(s []byte, n int) [][]byte { // Count counts the number of non-overlapping instances of sep in s. // If sep is an empty slice, Count returns 1 + the number of Unicode code points in s. func Count(s, sep []byte) int { - n := len(sep) - if n == 0 { + n := 0 + // special case + if len(sep) == 0 { return utf8.RuneCount(s) + 1 } - if n > len(s) { - return 0 - } - count := 0 - c := sep[0] - i := 0 - t := s[:len(s)-n+1] - for i < len(t) { - if t[i] != c { - o := IndexByte(t[i:], c) - if o < 0 { - break - } - i += o - } - if n == 1 || Equal(s[i:i+n], sep) { - count++ - i += n - continue + for { + i := Index(s, sep) + if i == -1 { + return n } - i++ + n++ + s = s[i+len(sep):] } - return count } // Contains reports whether subslice is within b. |
