Skip to content

Latest commit

 

History

History
57 lines (42 loc) · 1.52 KB

File metadata and controls

57 lines (42 loc) · 1.52 KB

2.2 bytes — byte slice 便利操作

该包定义了一些操作 byte slice 的便利操作。因为字符串可以表示为 []byte,因此,bytes 包定义的函数、方法等和 strings 包很类似,所以讲解时会和 strings 包类似甚至可以直接参考。

说明:为了方便,会称呼 []byte 为 字节数组

2.2.1 是否存在某个子slice

// 子slice subslice 在 b 中,返回 true
func Contains(b, subslice []byte) bool

该函数的内部调用了 bytes.Index 函数(在后面会讲解):

func Contains(b, subslice []byte) bool {
	return Index(b, subslice) != -1
}

题外:对比 strings.Contains 你会发现,一个判断 >=0,一个判断 != -1,可见库不是一个人写的,没有做到一致性。

2.2.2 []byte 出现次数

// slice sep 在 s 中出现的次数(无重叠)
func Count(s, sep []byte) int

和 strings 实现不同,此包中的 Count 核心代码如下:

count := 0
c := sep[0]
i := 0
t := s[:len(s)-n+1]
for i < len(t) {
	// 判断 sep 第一个字节是否在 t[i:] 中
	// 如果在,则比较之后相应的字节
	if t[i] != c {
		o := IndexByte(t[i:], c)
		if o < 0 {
			break
		}
		i += o
	}
	// 执行到这里表示 sep[0] == t[i]
	if n == 1 || Equal(s[i:i+n], sep) {
		count++
		i += n
		continue
	}
	i++
}

2.2.3 - 7 参见 strings 包对应的部分

2.2.4

导航