golang标准库中提供了bytes包,该包几乎和strings包给string提供的功能一样,只不过bytes包对应的是[]byte。和strings一样,并不修改传入变量,而是返回其副本修改之后的内容。
整个包分为以下几种操作:转换、比较、去除、分割、查找、替换
1. 转换
-
将s的副本中所有字符修改成大写(小写),然后返回
1func ToUpper(s []byte) []byte // 全部转大写func ToLower(s []byte) []byte // 全部转小写func ToTitle(s []byte) []byte // 全部转大写 -
使用指定的映射表将对s的副本中的所有字符进行修改,然后返回
123func ToUpperSpecial(_case unicode.SpecialCase, s []byte) []bytefunc ToLowerSpecial(_case unicode.SpecialCase, s []byte) []bytefunc ToTitleSpecial(_case unicode.SpecialCase, s []byte) -
将s的副本中的所有单词的首字符修改为Title格式返回。
1func Title(s []byte) []byte
2. 比较
-
比较两个
[]byte
,nil参数相当于[]byte{};1234//<code>a < b</code> 返回 -1//<code>a == b</code> 返回0//<code>a > b</code> 返回1func Compare(a, b []byte) int -
判断a、b是否相等,nil参数相当[]byte{}。
1func Equal(a, b []byte) bool -
判断s、t是否相似,忽略大写、小写、标题三种格式的区别。
1func EqualFold(s, t []byte) bool
3. 去除
-
去除s的副本左右包含cutset中的字符(返回s的副本)
123func Trim(s []byte, cutset string) []bytefunc TrimLeft(s []byte, cutset string) []bytefunc TrimRight(s []byte, cutset string) []byte -
去掉s副本的左右边中f函数中返回true的字符
123func TrimFunc(s []byte, f func(r rune) bool) []bytefunc TrimLeftFunc(s []byte, f func(r rune) bool) []bytefunc TrimRightFunc(s []byte, f func(r rune) bool) []byte -
去除s副本两边的空白(unicode.IsSpace)
1func TrimSpace(s []byte) []byte -
去掉s副本的前缀prefix(后缀suffix)
12func TrimPrefix(s, prefix []byte) []bytefunc TrimSuffix(s, suffix []byte) []byte
4. 分割
-
Split函数分割
Split函数以sep为分隔符将s的副本切割分成多个子串,结果不包含分隔符。
如果sep为空,则将s的副本分割成Unicode字符列表。
SplitN可以指定分割次数,超出n的部分将不进行分割,n小于0,表示分割所有。12func Split(s, sep []byte) [][]bytefunc SplitN(s, sep []byte, n int) [][]byte -
功能同Split,只不过结果包含分隔符(在各个子串尾部)
12func SplitAfter(s, sep []byte) [][]bytefunc SplitAfterN(s, sep []byte, n int) [][]byte -
以连续空白为分隔符将s的副本分隔成多个子串,结果不包含分隔符。
1func Fields(s []byte) [][]byte -
以符合f的字符为分隔符将s的副本分割成多个子串,结果不包含分割符。
1func FieldsFunc(s []byte, f func(rune) bool) [][]byte -
以sep为连接符,将子串列表s的副本连接成一个字节串。
1func Join(s [][]byte, sep []byte) []byte -
将子串b重复count次后返回。
1func Repeat(b []byte, count int) []byte
5. 查找
-
判断s是否有前缀prefix(后缀suffix)
12func HasPrefix(s, prefix []byte) boolfunc HasSuffix(s, suffix []byte) bool -
判断b中是否包含子串subslice(字符r)
12func Contains(b, subslice []byte) boolfunc ContainsRune(b []byte, r rune) bool -
判断b中是否包含chars中的任何一个字符
1func ContainsAny(b []byte, chars string) bool -
查找子串sep(字节c、字符r)在s中第一次出现的位置,找不到则返回-1。
123func Index(s, sep []byte) intfunc IndexByte(s []byte, c byte) intfunc IndexRune(s []byte, r rune) int -
查找chars中的任何一个字符在s中第一次出现的位置,找不到则返回-1。
1func IndexAny(s []byte, chars strings) int -
查找符合f的字符在s中第一次出现的位置,找不到则返回-1。
1func IndexFunc(s []byte, f func(r rune) bool) int -
功能同上,只不过查找最后一次出现的位置。
1234func LastIndex(s, sep []byte) intfunc LastIndexByte(s []byte, c byte) intfunc LastIndexAny(s []byte, chars string) intfunc LastIndexFunc(s []byte, f func(r rune) bool) int -
获取sep在s中出现的次数
1func Count(s, sep []byte) int
6. 替换
- 将s副本中的前n个old替换为new,n<0则替换全部。
1 |
func Replace(s, old, new []byte, n int) []byte |
- 将s副本中字符替换为mapping(r)的返回值,如果mapping返回负值,则丢弃该字符。
1 |
func Map(mapping func(r rune) rune, s []byte) []byte |
- 将s副本转换为[]rune类型返回
1 |
func Runes(s []byte) []rune |
7. Reader
- 将切片b封装成bytes.Reader对象
1 |
func NewReader(b []byte) *Reader |
- bytes.Reader实现了如下接口:
1)io.ReadeSeeker
2)io.ReaderAt
3)io.WriterTo
4)io.ByteScanner
5)io.RuneScanner
1 2 3 4 5 |
// 返回未读取部分的数据长度 func (r *Reader) Len() int // 返回底层数据的总长度,方便ReadAt使用,返回值不变。 func (r *Reader) Size() int64 |
8. Buffer
8.1. Buffer函数基础
Buffer是一个缓存,没有底层数据,缓存的容量会根据需要自动调整。大多数情况下,使用new(Buffer)就足以初始化一个Buffer了。
1 2 3 4 5 6 7 |
//将buf包装成bytes.Buffer对象。 type Buffer struct {...} //转化成bytes.Buffer对象 func NewBuffer(buf []byte) *Buffer func NewBufferString(s string) *Buffer |
-
bytes.Buffer实现了如下接口:
1)io.ReadWrite
2)io.ReaderFrom
3)io.WriterTo
4)io.ByteWriter
5)io.ByteScanner
6)io.RuneScanner -
未读取部分的数据长度
1func (b *Buffer) Len() int -
缓存的容量
1func (b *Buffer) Cap() int -
读取前n字节的数据并以切片形式返回,如果数据长度小于n,则全部读取。切片只在下一次读写操作前合法。
1func (b *Buffer) Next(n int) []byte -
读取第一个delim及其之前的内容,返回遇到的错误(一般是io.EOF)。
12func (b *Buffer) ReadBytes(delim byte) (line []byte, err error)func (b *Buffer) ReadString(delim byte) (line string, err error) -
写入r的UTF-8编码,返回写入的字节数和error。保留err是为了匹配bufio.Write的WriteRune
1func (b *Buffer) WriteRune(r rune) (n int, err error) -
写入s,返回写入的字节数和error。
1func (b *Buffer) WriteString(s string) (n int, err error) -
引用未读取部分的数据部分的数据切片(不移动读取位置)
1func (b *Buffer) Bytes() []byte -
返回未读取部分的数据字符串(不移动读取位置)
1func (b *Buffer) String() string -
自动增加缓存容量,以保证有n字节的剩余空间。如果n小于0或无法增加则会panic。
1func (b *Buffer) Grow(n int) -
将数据长度截短到n字节,如果n小于0或大于Cap则panic。
1func (b *Buffer) Teuncate(n int) -
重设缓冲区,清空所有数据(包括初始内容)。
1func (b *Buffer) Reset
8.2. Buffer Write测试用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
func main() { //newBuffer 整形转换成字节 var n int = 10000 intToBytes := IntToBytes(n) fmt.Println("==========int to bytes========") fmt.Println(intToBytes) //NewBufferString TestBufferString() //write BufferWrite() //WriteString BufferWriteString() //WriteByte BufferWriteByte() //WriteRune BufferWriteRune() } func IntToBytes(n int) []byte { x := int32(n) //创建一个内容是[]byte的slice的缓冲器 //与bytes.NewBufferString("")等效 bytesBuffer := bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer, binary.BigEndian, x) return bytesBuffer.Bytes() } func TestBufferString(){ buf1:=bytes.NewBufferString("swift") buf2:=bytes.NewBuffer([]byte("swift")) buf3:=bytes.NewBuffer([]byte{'s','w','i','f','t'}) fmt.Println("===========以下buf1,buf2,buf3等效=========") fmt.Println("buf1:", buf1) fmt.Println("buf2:", buf2) fmt.Println("buf3:", buf3) fmt.Println("===========以下创建空的缓冲器等效=========") buf4:=bytes.NewBufferString("") buf5:=bytes.NewBuffer([]byte{}) fmt.Println("buf4:", buf4) fmt.Println("buf5:", buf5) } func BufferWrite(){ fmt.Println("===========以下通过Write把swift写入Learning缓冲器尾部=========") newBytes := []byte("swift") //创建一个内容Learning的缓冲器 buf := bytes.NewBuffer([]byte("Learning")) //打印为Learning fmt.Println(buf.String()) //将newBytes这个slice写到buf的尾部 buf.Write(newBytes) fmt.Println(buf.String()) } func BufferWriteString(){ fmt.Println("===========以下通过Write把swift写入Learning缓冲器尾部=========") newString := "swift" //创建一个string内容Learning的缓冲器 buf := bytes.NewBufferString("Learning") //打印为Learning fmt.Println(buf.String()) //将newString这个string写到buf的尾部 buf.WriteString(newString) fmt.Println(buf.String()) } func BufferWriteByte(){ fmt.Println("===========以下通过WriteByte把swift写入Learning缓冲器尾部=========") var newByte byte = '!' //创建一个string内容Learning的缓冲器 buf := bytes.NewBufferString("Learning") //打印为Learning fmt.Println(buf.String()) //将newString这个string写到buf的尾部 buf.WriteByte(newByte) fmt.Println(buf.String()) } func BufferWriteRune(){ fmt.Println("===========以下通过WriteRune把\"好\"写入Learning缓冲器尾部=========") var newRune = '好' //创建一个string内容Learning的缓冲器 buf := bytes.NewBufferString("Learning") //打印为Learning fmt.Println(buf.String()) //将newString这个string写到buf的尾部 buf.WriteRune(newRune) fmt.Println(buf.String()) } |
8.3. Buffer Read测试用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
func Read(){ bufs := bytes.NewBufferString("Learning swift.") fmt.Println(bufs.String()) //声明一个空的slice,容量为8 l := make([]byte, 8) //把bufs的内容读入到l内,因为l容量为8,所以只读了8个过来 bufs.Read(l) fmt.Println("::bufs缓冲器内容::") fmt.Println(bufs.String()) //空的l被写入了8个字符,所以为 Learning fmt.Println("::l的slice内容::") fmt.Println(string(l)) //把bufs的内容读入到l内,原来的l的内容被覆盖了 bufs.Read(l) fmt.Println("::bufs缓冲器被第二次读取后剩余的内容::") fmt.Println(bufs.String()) fmt.Println("::l的slice内容被覆盖,由于bufs只有7个了,因此最后一个g被留下来了::") fmt.Println(string(l)) } func ReadByte(){ bufs := bytes.NewBufferString("Learning swift.") fmt.Println(bufs.String()) //读取第一个byte,赋值给b b, _ := bufs.ReadByte() fmt.Println(bufs.String()) fmt.Println(string(b)) } func ReadRune(){ bufs := bytes.NewBufferString("学swift.") fmt.Println(bufs.String()) //读取第一个rune,赋值给r r,z,_ := bufs.ReadRune() //打印中文"学",缓冲器头部第一个被拿走 fmt.Println(bufs.String()) //打印"学","学"作为utf8储存占3个byte fmt.Println("r=",string(r),",z=",z) } func ReadBytes(){ bufs := bytes.NewBufferString("现在开始 Learning swift.") fmt.Println(bufs.String()) var delim byte = 'L' line, _ := bufs.ReadBytes(delim) fmt.Println(bufs.String()) fmt.Println(string(line)) } func ReadFrom(){ //test.txt 内容是 "未来" file, _ := os.Open("learngo/bytes/text.txt") buf := bytes.NewBufferString("Learning swift.") buf.ReadFrom(file) //将text.txt内容追加到缓冲器的尾部 fmt.Println(buf.String()) } func Reset(){ bufs := bytes.NewBufferString("现在开始 Learning swift.") fmt.Println(bufs.String()) bufs.Reset() //数据清空 fmt.Println("::已经清空了bufs的缓冲内容::") fmt.Println(bufs.String()) } |
- 本文摘自golang中bytes包
微信赞赏
支付宝赞赏