问题

看这样一个例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "/some/key"
	fmt.Println(strings.TrimLeft(str, "/some"))
}
1
2
3
key

Program exited.

上例有正确返回,再看一例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "/some/sugar"
	fmt.Println(strings.TrimLeft(str, "/some"))
}
1
2
3
ugar

Program exited.

这例没有正确返回,下面进行解释

解释

我们使用的是TrimLeft函数:

1
2
3
4
5
func TrimLeft

func TrimLeft(s string, cutset string) string

TrimLeft returns a slice of the string s with all leading Unicode code points contained in cutset removed.

实际上,还有一个TrimPrefix的函数:

1
TrimPrefix returns s without the provided leading prefix string. If s doesnt start with prefix, s is returned unchanged.

这两个函数有什么区别呢,cutset指的是什么意思?

我们举个例子看看:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
	"fmt"
	"strings"
)

func main() {

	nodeOnlinePrefix := "/nodesli"
	kvs := []string{
		"/nodes/online/1ebbaa95eba5",
		"/nodes/online/d39d0dd1c159",
		"/nodes/online/d66b00076d8c",
	}

	nodes := []string{}
	for _, v := range kvs {
		str := fmt.Sprintf("%s", v)
		fmt.Printf("online node got key %s\n", str)
		n := strings.TrimLeft(str, nodeOnlinePrefix)
		fmt.Printf("online node got node %s\n", n)
		nodes = append(nodes, strings.TrimSpace(n))
	}
	fmt.Printf("online nodes: %v\n", nodes)
}
1
2
3
4
5
6
7
online node got key /nodes/online/1ebbaa95eba5
online node got node 1ebbaa95eba5
online node got key /nodes/online/d39d0dd1c159
online node got node 39d0dd1c159
online node got key /nodes/online/d66b00076d8c
online node got node 66b00076d8c
online nodes: [1ebbaa95eba5 39d0dd1c159 66b00076d8c]

这个所谓的cutset就是一个字符集, 而TrimLeft就是从左开始, 如果发现了不在cutset中的字符, 就从这个点返回.

比如有一个字符串 “1112345111”, TrimLeft(“1112345111”, “1”) 之后就成了 2345111, 对应的, TrimRight(“1112345111”, “1”)就变成了"1112345"; Trim(“1112345111”, “1”)则是从两头都砍, 返回的结果是"2345"

这是cutset中只有一个字符的情况, 如果集合中有多个字符,那么就从里面开始匹配, 什么时候找不到了, 就返回.

那么怎么才能去掉开头的一个”1”呢, 就是用TrimPrefix(“1112345111”, “1”), 对应的, 除去末尾的话, 就用 TrimSuffix.

转载:https://wrfly.kfd.me/posts/go-trimleft-and-trimprefix/