12.go开源groupcache项目笔记——byteview代码
定义结构体ByteView
type ByteView struct {
//If b is non-nil, b is used, else s is used.
b[]byte
sstring
}
b不为空使用b,b为空就使用s.
Len函数
返回一个整型数字。
如果b不会空,返回b的数组长度,不然就返回s的长度。
ByteSlice
如果b不会空,克隆b,如果为空,克隆s.
String
如果b不会空,返回b,否则返回s.
At
如果b不会空,返回b[i],否则返回s[i]
Slice
如果b不会空,从b中截取一段返回,否则从s返回。
SliceFrom
如果b不会空,从b中截取一段从入参指定开始到结束,否则从s返回从入参指定开始到结束。
Copy
如果b不会空,复制b到一个目标数组,如果为空则复制s,同时返回复制的字节数。
Equal
如果入参b2不会空,则判断v,b2.
EqualString
如果b为空,则返将入参s赋值为v.s.直接返回。
否则继续,先获得
获得v的长度。
如果s的长度和v的长度不一样,返回false
循环v.b判断是否是s[i]相等,有一个不相等则返回false.
EqualBytes
如果b不为空,判断v.b和入参b2是否相等。并返回。
否则,获得v长度,判断与b2长度是否一样。
接着判断b2和v.s[i]是否都一样。有一个不相等则返回FALSE。
Reader
如果b不为空,通过NewReader来读取v.b,返回为io.ReadSeeker
否则返回strings.NewReader(v.s)
ReadAt
可以读取带偏移[]byte,入参为byte和off(偏移),返回n(返回的值))和err(错误信息)
通过如下实现
n =v.SliceFrom(int(off)).Copy(p)