首页 文章资讯内容详情

Golang学习 - bytes 包

2026-06-01 4 花语

本文内容纲要:

------------------------------------------------------------ 对于传入[]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