go version go1.18.5
目录
- function List
-
- func Clone(s string ) string
- func Compare(a, b string) int
- func Index (s, substr string) int
- func Contains(s,substr string) bool
- func Count (s,substr string ) int
- func Cut (s, sep string) (before, after string, found bool)
- func EqualFold(s, t string) bool
- func Fields(s string) [] string
- func HasPrefix(s,prefix string ) bool
- func HasSuffix(s, suffix string) bool
- func Join(elems []string, sep string) string
- func LastIndex(s, substr string) int
- func Repeat(s string, count int) string
- func Replace(s,old,new string ,n int ) string
function List
func Clone(s string ) string
tip : 如果 s 为空字符串,不会额外分配空间
func Clone(s string) string {
if len(s) == 0 {
return ""
}
b := make([]byte, len(s))
copy(b, s)
return unsafe.String(&b[0], len(b))
}
func Compare(a, b string) int
基本不用,直接用 > < = 比较字符串也是一样的
func Index (s, substr string) int
substr 在 s 中首次出现的位置,没有找到返回 -1 。
比较有意思的,是在代码实现中的一个写法。 判断是否是相同字符串时候,先用 前两个byte 来判断,成功以后再判断完整的字符串。估计是实践中得到的,不同字符串,前两byte 相同的概率比较低,用以提升性能
// Index returns the index of the first instance of substr in s, or -1 if substr is not present in s.
func Index(s, substr string) int {
n := len(substr)
switch {
case n == 0:
return 0
case n == 1:
return IndexByte(s, substr[0])
case n == len(s):
if substr == s {
return 0
}
return -1
case n > len(s):
return -1
case n <= bytealg.MaxLen:
// Use brute force when s and substr both are small
if len(s) <= bytealg.MaxBruteForce {
return bytealg.IndexString(s, substr)
}
c0 := substr[0]
c1 := substr[1]
i := 0
t := len(s) - n + 1
fails := 0
for i < t {
if s[i] != c0 {
// IndexByte is faster than bytealg.IndexString, so use it as long as
// we're not getting lots of false positives.
o := IndexByte(s[i+1:t], c0)
if o < 0 {
return -1
}
i += o + 1
}
if s[i+1] == c1 && s[i:i+n] == substr {
return i
}
fails++
i++
// Switch to bytealg.IndexString when IndexByte produces too many false positives.
if fails > bytealg.Cutover(i) {
r := bytealg.IndexString(s[i:], substr)
if r >= 0 {
return r + i
}
return -1
}
}
return -