5.7、Golang 标准库-bytes
bytes 包提供了对字节切片进行读写操作的一系列函数
类型转换
byte 和 int 类型转换
go
package main
import "fmt"
func main() {
var i int = 10
var b byte = 100
fmt.Printf("i: %v\n", i)
// i: 10
fmt.Printf("b: %v\n", b)
// b: 100
i = int(b)
fmt.Printf("i: %v\n", i)
// i: 100
b = byte(i)
fmt.Printf("b: %v\n", b)
// b: 100
}
byte 和 string 类型转换
go
package main
import "fmt"
func main() {
var s string = "Hello world"
b := []byte(s)
fmt.Printf("b: %v\n", b)
// b: [72 101 108 108 111 32 119 111 114 108 100]
s = string(b)
fmt.Printf("s: %v\n", s)
// s: Hello world
}
常用函数
Contains 包含
go
package main
import (
"bytes"
"fmt"
)
func main() {
b := []byte("hello world")
b1 := []byte("HELLO")
b2 := []byte("hello")
b3 := bytes.Contains(b, b1)
fmt.Printf("b3: %v\n", b3)
// b3: false
b4 := bytes.Contains(b, b2)
fmt.Printf("b4: %v\n", b4)
// b4: true
}
Count 统计出现次数
go
package main
import (
"bytes"
"fmt"
)
func main() {
b := []byte("hello world hello world")
b1 := []byte("hello")
i := bytes.Count(b, b1)
fmt.Printf("i: %v\n", i)
// i: 2
}
Repeat 重复
go
package main
import (
"bytes"
"fmt"
)
func main() {
b := []byte("x")
b1 := bytes.Repeat(b, 3)
fmt.Printf("b1: %v\n", string(b1))
// b1: xxx
}
Replace 替换
go
package main
import (
"bytes"
"fmt"
)
func main() {
b := []byte("hello")
old := []byte("l")
new := []byte("x")
// 第三个参数是替换次数
b1 := bytes.Replace(b, old, new, 1)
fmt.Printf("b1: %v\n", string(b1))
// b1: hexlo
}
Runes 转换汉字
go
package main
import (
"bytes"
"fmt"
)
func main() {
b := []byte("你好世界")
r := bytes.Runes(b)
fmt.Printf("len(b): %v\n", len(b))
// len(b): 12
fmt.Printf("len(r): %v\n", len(r))
// len(r): 4
}
join 字节切片连接
go
package main
import (
"bytes"
"fmt"
)
func main() {
b := [][]byte{
[]byte("你好"),
[]byte("世界"),
}
s := []byte("#")
b2 := bytes.Join(b, s)
fmt.Printf("b2: %v\n", string(b2))
// b2: 你好#世界
}
Reader 类型
Reader 实现的接口
go
io.Reader
io.ReaderAt
io.WriterTo
io.Seeker
io.ByteScanner
io.RuneScanner
示例
go
package main
import (
"bytes"
"fmt"
)
func main() {
data := "1234567890"
// 创建一个Reader
br := bytes.NewReader([]byte(data))
// 返回未读取部分的长度
fmt.Printf("br.Len(): %v\n", br.Len())
// br.Len(): 10
// 返回底层数据总长度
fmt.Printf("br.Size(): %v\n", br.Size())
// br.Size(): 10
// 每次读取两个字节
buf := make([]byte, 2)
for {
n, err := br.Read(buf)
if err != nil {
break
}
fmt.Printf("string(buf[:n]): %v\n", string(buf[:n]))
}
// 设置偏移量,定位到文件头
br.Seek(0, 0)
// 一个字节一个字节的读取
for {
b, err := br.ReadByte()
if err != nil {
break
}
fmt.Printf("b: %v\n", string(b))
}
br.Seek(0, 0)
off := int64(0)
for {
// 指定偏移量读取
n, err := br.ReadAt(buf, off)
if err != nil {
break
}
fmt.Println(off, string(buf[:n]))
off += int64(n)
}
}
Buffer类型
缓冲区是具有读取和写入方法可变大小的字节缓冲区
声明Buffer的4中方法
go
// 直接定义一个Buffer变量,不用初始化,可以直接使用
var buf bytes.Buffer
// 使用New返回Buffer变量
b := new(bytes.Buffer)
// 从[]byte切片,构造一个Buffer
b := bytes.NewBuffer(s []byte)
// 从string变量,构造一个Buffer
b := bytes.NewBufferString(s string)
示例
go
package main
import (
"bytes"
"fmt"
)
func main() {
var buf bytes.Buffer
fmt.Printf("buf: %v\n", buf)
// buf: {[] 0 0}
b := bytes.NewBuffer([]byte("hello"))
fmt.Printf("b: %v\n", b)
// b: hello
b2 := bytes.NewBufferString("hello")
fmt.Printf("b2: %v\n", b2)
// b2: hello
}
向Buffer写入数据
go
package main
import (
"bytes"
"fmt"
)
func main() {
var buf bytes.Buffer
n, _ := buf.WriteString("hello")
fmt.Printf("n: %v\n", n)
// n: 5
fmt.Printf("buf: %v\n", string(buf.Bytes()))
// buf: hello
}
从Buffer读取数据
go
package main
import (
"bytes"
"fmt"
"io"
)
func main() {
b := bytes.NewBufferString("hello world")
// 循环读取,每次读取2个字节
buf := make([]byte, 2)
for {
n, err := b.Read(buf)
// 到达文件尾部
if err == io.EOF {
break
}
fmt.Printf("n: %v\n", n)
// n: 2
fmt.Printf("buf: %v\n", string(buf[0:n]))
// buf: he
}
}