Golang学习 - bytes 包
本文内容纲要:
------------------------------------------------------------
对于传入[]byte的函数,都不会修改传入的参数,返回值要么是参数的副本,要么是参数的切片。
------------------------------------------------------------
//转换
//将s中的所有字符修改为大写(小写、标题)格式返回。
funcToUpper(s[]byte)[]byte
funcToLower(s[]byte)[]byte
funcToTitle(s[]byte)[]byte
//使用指定的映射表将s中的所有字符修改为大写(小写、标题)格式返回。
funcToUpperSpecial(_caseunicode.SpecialCase,s[]byte)[]byte
funcToLowerSpecial(_caseunicode.SpecialCase,s[]byte)[]byte
funcToTitleSpecial(_caseunicode.SpecialCase,s[]byte)[]byte
//将s中的所有单词的首字符修改为Title格式返回。
//BUG:不能很好的处理以Unicode标点符号分隔的单词。
funcTitle(s[]byte)[]byte
------------------------------
//比较
//比较两个[]byte,nil参数相当于空[]byte。
//a<b返回-1
//a==b返回0
//a>b返回1
funcCompare(a,b[]byte)int
//判断a、b是否相等,nil参数相当于空[]byte。
funcEqual(a,b[]byte)bool
//判断s、t是否相似,忽略大写、小写、标题三种格式的区别。
//参考unicode.SimpleFold函数。
funcEqualFold(s,t[]byte)bool
------------------------------
//示例:EqualFold
funcmain(){
s1:="ΦφϕkKK"
s2:="ϕΦφKkK"
//看看s1里面是什么
for_,c:=ranges1{
fmt.Printf("%-5x",c)
}
fmt.Println()
//看看s2里面是什么
for_,c:=ranges2{
fmt.Printf("%-5x",c)
}
fmt.Println()
//看看s1和s2是否相似
fmt.Println(bytes.EqualFold([]byte(s1),[]byte(s2)))
}
//输出结果:
//3a63c63d5206b4b212a
//3d53a63c620212a6b4b
//true
------------------------------
//清理
//去掉s两边(左边、右边)包含在cutset中的字符(返回s的切片)
funcTrim(s[]byte,cutsetstring)[]byte
funcTrimLeft(s[]byte,cutsetstring)[]byte
funcTrimRight(s[]byte,cutsetstring)[]byte
//去掉s两边(左边、右边)符合f要求的字符(返回s的切片)
funcTrimFunc(s[]byte,ffunc(rrune)bool)[]byte
funcTrimLeftFunc(s[]byte,ffunc(rrune)bool)[]byte
funcTrimRightFunc(s[]byte,ffunc(rrune)bool)[]byte
//去掉s两边的空白(unicode.IsSpace)(返回s的切片)
funcTrimSpace(s[]byte)[]byte
//去掉s的前缀prefix(后缀suffix)(返回s的切片)
funcTrimPrefix(s,prefix[]byte)[]byte
funcTrimSuffix(s,suffix[]byte)[]byte
------------------------------
//示例
funcmain(){
bs:=[][]byte{
[]byte("HelloWorld!"),
[]byte("Hello世界!"),
[]byte("hellogolang."),
}
f:=func(rrune)bool{
returnbytes.ContainsRune([]byte("!!."),r)
}
for_,b:=rangebs{
fmt.Printf("%q\n",bytes.TrimFunc(b,f))
}
//"HelloWorld"
//"Hello世界"
//"HelloGolang"
for_,b:=rangebs{
fmt.Printf("%q\n",bytes.TrimPrefix(b,[]byte("Hello")))
}
//"World!"
//"世界!"
//"helloGolang."
}
------------------------------
//拆合
//Split以sep为分隔符将s切分成多个子串,结果不包含分隔符。
//如果sep为空,则将s切分成Unicode字符列表。
//SplitN可以指定切分次数n,超出n的部分将不进行切分。
funcSplit(s,sep[]byte)[][]byte
funcSplitN(s,sep[]byte,nint)[][]byte
//功能同Split,只不过结果包含分隔符(在各个子串尾部)。
funcSplitAfter(s,sep[]byte)[][]byte
funcSplitAfterN(s,sep[]byte,nint)[][]byte
//以连续空白为分隔符将s切分成多个子串,结果不包含分隔符。
funcFields(s[]byte)[][]byte
//以符合f的字符为分隔符将s切分成多个子串,结果不包含分隔符。
funcFieldsFunc(s[]byte,ffunc(rune)bool)[][]byte
//以sep为连接符,将子串列表s连接成一个字节串。
funcJoin(s[][]byte,sep[]byte)[]byte
//将子串b重复count次后返回。
funcRepeat(b[]byte,countint)[]byte
------------------------------
//示例
funcmain(){
b:=[]byte("HelloWorld!")
fmt.Printf("%q\n",bytes.Split(b,[]byte{''}))
//["""""Hello""""""World""!"""""]
fmt.Printf("%q\n",bytes.Fields(b))
//["Hello""World""!"]
f:=func(rrune)bool{
returnbytes.ContainsRune([]byte("!"),r)
}
fmt.Printf("%q\n",bytes.FieldsFunc(b,f))
//["Hello""World"]
}
------------------------------
//子串
//判断s是否有前缀prefix(后缀suffix)
funcHasPrefix(s,prefix[]byte)bool
funcHasSuffix(s,suffix[]byte)bool
//判断b中是否包含子串subslice(字符r)
funcContains(b,subslice[]byte)bool
funcContainsRune(b[]byte,rrune)bool
//判断b中是否包含chars中的任何一个字符
funcContainsAny(b[]byte,charsstring)bool
//查找子串sep(字节c、字符r)在s中第一次出现的位置,找不到则返回-1。
funcIndex(s,sep[]byte)int
funcIndexByte(s[]byte,cbyte)int
funcIndexRune(s[]byte,rrune)int
//查找chars中的任何一个字符在s中第一次出现的位置,找不到则返回-1。
funcIndexAny(s[]byte,charsstring)int
//查找符合f的字符在s中第一次出现的位置,找不到则返回-1。
funcIndexFunc(s[]byte,ffunc(rrune)bool)int
//功能同上,只不过查找最后一次出现的位置。
funcLastIndex(s,sep[]byte)int
funcLastIndexByte(s[]byte,cbyte)int
funcLastIndexAny(s[]byte,charsstring)int
funcLastIndexFunc(s[]byte,ffunc(rrune)bool)int
//获取sep在s中出现的次数(sep不能重叠)。
funcCount(s,sep[]byte)int
------------------------------
//替换
//将s中前n个old替换为new,n<0则替换全部。
funcReplace(s,old,new[]byte,nint)[]byte
//将s中的字符替换为mapping(r)的返回值,
//如果mapping返回负值,则丢弃该字符。
funcMap(mappingfunc(rrune)rune,s[]byte)[]byte
//将s转换为[]rune类型返回
funcRunes(s[]byte)[]rune
------------------------------------------------------------
typeReaderstruct{...}
//将b包装成bytes.Reader对象。
funcNewReader(b[]byte)*Reader
//bytes.Reader实现了如下接口:
//io.ReadSeeker
//io.ReaderAt
//io.WriterTo
//io.ByteScanner
//io.RuneScanner
//返回未读取部分的数据长度
func(r*Reader)Len()int
//返回底层数据的总长度,方便ReadAt使用,返回值永远不变。
func(r*Reader)Size()int64
//将底层数据切换为b,同时复位所有标记(读取位置等信息)。
func(r*Reader)Reset(b[]byte)
------------------------------
//示例
funcmain(){
b1:=[]byte("HelloWorld!")
b2:=[]byte("Hello世界!")
buf:=make([]byte,6)
rd:=bytes.NewReader(b1)
rd.Read(buf)
fmt.Printf("%q\n",buf)//"Hello"
rd.Read(buf)
fmt.Printf("%q\n",buf)//"World!"
rd.Reset(b2)
rd.Read(buf)
fmt.Printf("%q\n",buf)//"Hello"
fmt.Printf("Size:%d,Len:%d\n",rd.Size(),rd.Len())
//Size:15,Len:9
}
------------------------------------------------------------
typeBufferstruct{...}
//将buf包装成bytes.Buffer对象。
funcNewBuffer(buf[]byte)*Buffer
//将s转换为[]byte后,包装成bytes.Buffer对象。
funcNewBufferString(sstring)*Buffer
//Buffer本身就是一个缓存(内存块),没有底层数据,缓存的容量会根据需要
//自动调整。大多数情况下,使用new(Buffer)就足以初始化一个Buffer了。
//bytes.Buffer实现了如下接口:
//io.ReadWriter
//io.ReaderFrom
//io.WriterTo
//io.ByteWeriter
//io.ByteScanner
//io.RuneScanner
//未读取部分的数据长度
func(b*Buffer)Len()int
//缓存的容量
func(b*Buffer)Cap()int
//读取前n字节的数据并以切片形式返回,如果数据长度小于n,则全部读取。
//切片只在下一次读写操作前合法。
func(b*Buffer)Next(nint)[]byte
//读取第一个delim及其之前的内容,返回遇到的错误(一般是io.EOF)。
func(b*Buffer)ReadBytes(delimbyte)(line[]byte,errerror)
func(b*Buffer)ReadString(delimbyte)(linestring,errerror)
//写入r的UTF-8编码,返回写入的字节数和nil。
//保留err是为了匹配bufio.Writer的WriteRune方法。
func(b*Buffer)WriteRune(rrune)(nint,errerror)
//写入s,返回写入的字节数和nil。
func(b*Buffer)WriteString(sstring)(nint,errerror)
//引用未读取部分的数据切片(不移动读取位置)
func(b*Buffer)Bytes()[]byte
//返回未读取部分的数据字符串(不移动读取位置)
func(b*Buffer)String()string
//自动增加缓存容量,以保证有n字节的剩余空间。
//如果n小于0或无法增加容量则会panic。
func(b*Buffer)Grow(nint)
//将数据长度截短到n字节,如果n小于0或大于Cap则panic。
func(b*Buffer)Truncate(nint)
//重设缓冲区,清空所有数据(包括初始内容)。
func(b*Buffer)Reset()
------------------------------
//示例
funcmain(){
rd:=bytes.NewBufferString("HelloWorld!")
buf:=make([]byte,6)
//获取数据切片
b:=rd.Bytes()
//读出一部分数据,看看切片有没有变化
rd.Read(buf)
fmt.Printf("%s\n",rd.String())//World!
fmt.Printf("%s\n\n",b)//HelloWorld!
//写入一部分数据,看看切片有没有变化
rd.Write([]byte("abcdefg"))
fmt.Printf("%s\n",rd.String())//World!abcdefg
fmt.Printf("%s\n\n",b)//HelloWorld!
//再读出一部分数据,看看切片有没有变化
rd.Read(buf)
fmt.Printf("%s\n",rd.String())//abcdefg
fmt.Printf("%s\n",b)//HelloWorld!
}
------------------------------------------------------------
本文内容总结:
原文链接:https://www.cnblogs.com/golove/p/3287729.html