Go 标准库学习

bytes和strings函数比对

bytesstrings
函数签名功能函数签名功能
func explode(s []byte, n int) [][]byte以每个utf8字符为单位,将前n个字符对应的[]byte型组成新的slice返回func explode(s string, n int) []string以每个utf8字符为单位,将前n个字符对应的string型组成新的slice返回
func countGeneric(s, sep []byte) int返回s中有几个sep,若sep为空,则返回sutf8.RuneCount(s) + 1func countGeneric(s, substr string) int返回s中有几个substr,若substr为空,则返回sutf8.RuneCount(s) + 1
func Contains(b, subslice []byte) boolb中是否含有subslicefunc Contains(s, substr string) bools中是否含有substr
func ContainsAny(b []byte, chars string) boolb中是否含有字符串charsfunc ContainsAny(s, chars string) bools中是否含有字符串chars中的任意一个unicode字符
func ContainsRune(b []byte, r rune) boolb中是否含有rune rfunc ContainsRune(s string, r rune) bools中是否含有rune r
func indexBytePortable(s []byte, c byte) int(并没有导出也没有用于内部)返回s中c的位置,若不含有c,则返回-1
func LastIndex(s, sep []byte) int返回s中最后一个sep的位置,若sep为空,返回s的长度,若不含sep,则返回-1func LastIndex(s, substr string) int返回s中最后一个substr的位置,若substr为空,返回s的长度,若不含substr,则返回-1
func LastIndexByte(s []byte, c byte) int返回最后一个c的位置,没有则返回-1func LastIndexByte(s string, c byte) int返回最后一个c的位置,没有则返回-1
func IndexRune(s []byte, r rune) int返回第一个r的位置,如果r无法解码为utf8又不是\uFFFD,认为没找到返回-1func IndexRune(s string, r rune) int返回第一个r的位置,如果r无法解码为utf8又不是\uFFFD,认为没找到返回-1
func IndexAny(s []byte, chars string) int返回chars中任意一个unicode字符在s中第一次出现的位置func IndexAny(s, chars string) int返回chars中任意一个unicode字符在s中第一次出现的位置
func LastIndexAny(s []byte, chars string) int返回chars中任意一个unicode字符在s中最后一次出现的位置func LastIndexAny(s, chars string) int返回chars中任意一个unicode字符在s中最后一次出现的位置
func genSplit(s, sep []byte, sepSave, n int) [][]byte按sep划分s,返回前n个组成的slice,每个slice中sep的保留位数有sepSave决定,n小于0时,返回所有划分组成的slicefunc genSplit(s, sep string, sepSave, n int) []string按sep划分s,返回前n个组成的slice,每个slice中sep的保留位数有sepSave决定,n小于0时,返回所有划分组成的slice
func SplitN(s, sep []byte, n int) [][]byte按sep划分s,返回前n个划分的slice组成的slice,每个划分的slice不包含sep,n小于0返回所有划分组成的slicefunc SplitN(s, sep string, n int) []string按sep划分s,返回前n个划分的string组成的slice,每个划分的string不包含sep,n小于0返回所有划分组成的slice
func SplitAfterN(s, sep []byte, n int) [][]byte按sep划分s,返回前n个划分的slice组成slice,每个划分包含sepfunc SplitAfterN(s, sep string, n int) []string按sep划分s,返回前n个划分的string组成slice,每个划分包含sep
func Split(s, sep []byte) [][]byte返回所有的由sep划分的slice组成的slice,每个划分不包含sepfunc Split(s, sep string) []string返回所有的由sep划分的string组成的slice,每个划分不包含sep
func SplitAfter(s, sep []byte) [][]byte返回所有的由sep划分的slice组成的slice,每个划分包含sepfunc SplitAfter(s, sep string) []string返回所有的由sep划分的string组成的slice,每个划分包含sep
func Fields(s []byte) [][]byte按unicode.IsSpace划分s(所有连续的whitespce当成一个sep),返回所有的划分组成的slicefunc Fields(s string) []string按unicode.IsSpace划分s(所有连续的whitespce当成一个sep),返回所有的划分组成的slice
func FieldsFunc(s []byte, f func(rune) bool) [][]byte如果s中对应的一个rune满足f,则这个rune就是s的一个分隔符,返回s中所有分隔符划分的子slice的slicefunc FieldsFunc(s string, f func(rune) bool) []string如果s中对应的一个rune满足f,则这个rune就是s的一个分隔符,返回s中所有分隔符划分的子string的slice
func Join(s [][]byte, sep []byte) []byte将s中的元素用sep拼接起来,返回一个新的slicefunc Join(a []string, sep string) string 将s中的元素用sep拼接起来,返回一个新的string
func HasPrefix(s, prefix []byte) bool判断s是否以prefix开头func HasPrefix(s, prefix string) bool判断s是否以prefix开头
func HasSuffix(s, suffix []byte) bool判断s是否以suffix结尾func HasSuffix(s, suffix string) bool判断s是否以suffix结尾
func Map(mapping func(r rune) rune, s []byte) []byte将s中对应的每个rune字符作用映射f得到新的字符,再将这些字符转为utf8存储在一个新的slice中返回func Map(mapping func(rune) rune, s string) string将s中对应的每个rune字符作用映射f得到新的字符,再将这些字符存储在一个新的string中返回
func Repeat(b []byte, count int) []byte重复b count次,返回新的slicefunc Repeat(s string, count int) string重复s count次,返回新的string
func ToUpper(s []byte) []byte转为大写func ToUpper(s string) string转为大写
func ToLower(s []byte) []byte 转为小写func ToLower(s string) string转为小写
func ToTitle(s []byte) []byte转为Titlefunc ToTitle(s string) string转为Title
func ToUpperSpecial(c unicode.SpecialCase, s []byte) []byte只将SpecialCase范围里的字符转为大写func ToUpperSpecial(c unicode.SpecialCase, s string) string只将SpecialCase范围里的字符转为大写
func ToLowerSpecial(c unicode.SpecialCase, s []byte) []byte只将SpecialCase范围里的字符转为小写func ToLowerSpecial(c unicode.SpecialCase, s string) string只将SpecialCase范围里的字符转为小写
func ToTitleSpecial(c unicode.SpecialCase, s []byte) []byte只将SpecialCase范围里的字符转为Titlefunc ToTitleSpecial(c unicode.SpecialCase, s string) string只将SpecialCase范围里的字符转为Title
func isSeparator(r rune) boolr是否可以作为一个词(unicode)的分隔符
ascii码,数字,字母,下划线不可以
非ascii码,unicode的数字,字母不可以,剩下其他认为是unicode的space可以
func isSeparator(r rune) boolr是否可以作为一个词(unicode)的分隔符
ascii码,数字,字母,下划线不可以
非ascii码,unicode的数字,字母不可以,剩下其他认为是unicode的space可以
func Title(s []byte) []byte 调用Map,s中非词分隔符的字符转换为Titlefunc Title(s string) string调用Map,s中非词分隔符的字符转换为Title
func TrimLeftFunc(s []byte, f func(r rune) bool) []byte以左边起第一个不满足f的rune对应的utf8码开始到s末尾的子slicefunc TrimLeftFunc(s string, f func(rune) bool) string以左边起第一个不满足f的rune对应的utf8码开始到s末尾的子string
func TrimRightFunc(s []byte, f func(r rune) bool) []byte以s头开始到从右边起第一个不满足f的rune对应的utf8码为终点的子slicefunc TrimRightFunc(s string, f func(rune) bool) string以s头开始到从右边起第一个不满足f的rune对应的utf8码为终点的子string
func TrimFunc(s []byte, f func(r rune) bool) []byte 去掉左边和去掉右边的结合体func TrimFunc(s string, f func(rune) bool) string去掉左边和去掉右边的结合体
func TrimPrefix(s, prefix []byte) []byte去掉prefix后的子slicefunc TrimPrefix(s, prefix string) string去掉prefix后的子string
func TrimSuffix(s, suffix []byte) []byte去掉suffix后的子slicefunc TrimSuffix(s, suffix string) string去掉suffix后的子string
func IndexFunc(s []byte, f func(r rune) bool) int返回s中第一个满足f的rune字符对应的utf8码的起始位置func IndexFunc(s string, f func(rune) bool) int返回s中第一个满足f的rune字符对应的utf8码的起始位置
func LastIndexFunc(s []byte, f func(r rune) bool) int返回s中最后一个满足f的rune字符对应的utf8码的起始位置func LastIndexFunc(s string, f func(rune) bool) int返回s中最后一个满足f的rune字符对应的utf8码的起始位置
func indexFunc(s []byte, f func(r rune) bool, truth bool)返回s中第一个在f作用下得到truth的rune字符对应的utf8码的起始位置func indexFunc(s string, f func(rune) bool, truth bool) int返回s中第一个在f作用下得到truth的rune字符对应的utf8码的起始位置
func lastIndexFunc(s []byte, f func(r rune) bool, truth bool) int返回s中最后一个在f作用下得到truth的rune字符对应的utf8码的起始位置func lastIndexFunc(s string, f func(rune) bool, truth bool) int返回s中最后一个在f作用下得到truth的rune字符对应的utf8码的起始位置
func makeASCIISet(chars string) (as asciiSet, ok bool)返回s中碰到非ascii码之前所有ascii码的集合,以及s中是否都是ascii码
可以把asciiSet看成是一个32字节长度的值,其中低16字节共计128位表达128个ascii码[0,127],高16字节用来比对非ascii码
具体存储:
asciiSet是一个含有8个元素的数组,每个元素有32位,共计256位,
其中元素的位置保存了该字符(uint8)对应的高3位(c>>5)的信息,
元素的内容保存了每个字符低5位(1 << uint(c&31))的信息,5位最大是31(11111),
刚好uint32的每一位可以代表在相同高3位的情况下,所有字符的低5位情况,
这样就可以用数组的前4个元素完整表达128个ascii了
func makeASCIISet(chars string) (as asciiSet, ok bool)返回s中碰到非ascii码之前所有ascii码的集合,以及s中是否都是ascii码
可以把asciiSet看成是一个32字节长度的值,其中低16字节共计128位表达128个ascii码[0,127],高16字节用来比对非ascii码
具体存储:
asciiSet是一个含有8个元素的数组,每个元素有32位,共计256位,
其中元素的位置保存了该字符(uint8)对应的高3位(c>>5)的信息,
元素的内容保存了每个字符低5位(1 << uint(c&31))的信息,5位最大是31(11111),
刚好uint32的每一位可以代表在相同高3位的情况下,所有字符的低5位情况,
这样就可以用数组的前4个元素完整表达128个ascii了
func (as *asciiSet) contains(c byte) boolc是否在as中func (as *asciiSet) contains(c byte) boolc是否在as中
func makeCutsetFunc(cutset string) func(r rune) bool返回一个判断r是否在cutset字符串中的函数
若为单字节字符串,则返回一个直接比较r是否和cutset相同的函数
根据cutset创建一个ascii码的集合,
如果全是ascii,则返回一个用来判断r是否在上述集合中的函数
如果含有非ascii,则返回一个逐一循环cutset中rune字符,判断r是否其中之一的函数
func makeCutsetFunc(cutset string) func(rune) bool返回一个判断r是否在cutset字符串中的函数
若为单字节字符串,则返回一个直接比较r是否和cutset相同的函数
根据cutset创建一个ascii码的集合,
如果全是ascii,则返回一个用来判断r是否在上述集合中的函数
如果含有非ascii,则返回一个逐一循环cutset中rune字符,判断r是否其中之一的函数
func Trim(s []byte, cutset string) []byte将s左右两端连续属于cutset的rune字符去除,保留中间的子slicefunc Trim(s string, cutset string) string将s左右两端连续属于cutset的rune字符去除,保留中间的子string
func TrimLeft(s []byte, cutset string) []byte将s左边连续属于cutset的rune字符去除,返回剩下的子slicefunc TrimLeft(s string, cutset string) string将s左边连续属于cutset的rune字符去除,返回剩下的子string
func TrimRight(s []byte, cutset string) []byte将s右边连续属于cutset的rune字符去除,返回剩下的子slicefunc TrimRight(s string, cutset string) string将s右边连续属于cutset的rune字符去除,返回剩下的子string
func TrimSpace(s []byte) []byte去除s左右两端的whitespce,保留剩下的子slicefunc TrimSpace(s string) string去除s左右两端的whitespce,保留剩下的子string
func Runes(s []byte) []rune返回s对应的rune类型的slice
func Replace(s, old, new []byte, n int) []byte将s中前n个old替换成new,返回一个新的slice,n为负数或者n>old个数时,替换所有oldfunc Replace(s, old, new string, n int) string将s中前n个old替换成new,返回一个新的string,n为负数或者n>old个数时,替换所有old
func EqualFold(s, t []byte) bool判断s和t在不区分大小写(包括unicode case)的情况下是否相等func EqualFold(s, t string) bool判断s和t在不区分大小写(包括unicode case)的情况下是否相等
func indexRabinKarp(s, sep []byte) int返回第一个sep在s中的位置
Rabin-Karp字符串匹配算法和前面介绍的《朴素字符串匹配算法》类似,也是对应每一个字符进行比较,不同的是Rabin-Karp采用了把字符进行预处理,也就是对每个字符进行对应进制数并取模运算,类似于通过某种函数计算其函数值,比较的是每个字符的函数值。预处理时间O(m),匹配时间是O((n-m+1)m)。
Rabin-Karp算法的思想:
假设待匹配字符串的长度为M,目标字符串的长度为N(N>M);
首先计算待匹配字符串的hash值,计算目标字符串前M个字符的hash值;
比较前面计算的两个hash值,比较次数N-M+1:
若hash值不相等,则继续计算目标字符串的下一个长度为M的字符子串的hash值
若hash值相同,则需要使用朴素算法再次判断是否为相同的字串;
func indexRabinKarp(s, substr string) int返回第一个sep在s中的位置
Rabin-Karp字符串匹配算法和前面介绍的《朴素字符串匹配算法》类似,也是对应每一个字符进行比较,不同的是Rabin-Karp采用了把字符进行预处理,也就是对每个字符进行对应进制数并取模运算,类似于通过某种函数计算其函数值,比较的是每个字符的函数值。预处理时间O(m),匹配时间是O((n-m+1)m)。
Rabin-Karp算法的思想:
假设待匹配字符串的长度为M,目标字符串的长度为N(N>M);
首先计算待匹配字符串的hash值,计算目标字符串前M个字符的hash值;
比较前面计算的两个hash值,比较次数N-M+1:
若hash值不相等,则继续计算目标字符串的下一个长度为M的字符子串的hash值
若hash值相同,则需要使用朴素算法再次判断是否为相同的字串;
func hashStr(sep []byte) (uint32, uint32)计算sep的hash,用于Rabin-Karp算法func hashStr(sep string) (uint32, uint32)计算sep的hash,用于Rabin-Karp算法
func hashStrRev(sep string) (uint32, uint32)计算reverse(sep)的hash,用于Rabin-Karp算法
comments powered by Disqus