const timetemplate = "2006-01-02 15:04:05"
func main() {
// func Compare(a, b []byte) int
// 比较a,b两个切片是否相等, a=b 返回0,a<b 返回-1,a>b 返回1
fmt.Println("bytes.Compare([]byte{}, []byte{}):", bytes.Compare([]byte{}, []byte{})) // 0
fmt.Println("bytes.Compare([]byte{1}, []byte{2}):", bytes.Compare([]byte{1}, []byte{2})) // -1
fmt.Println("bytes.Compare([]byte{2}, []byte{1}):", bytes.Compare([]byte{2}, []byte{1})) // 1
fmt.Println("bytes.Compare([]byte{}, nil):", bytes.Compare([]byte{}, nil)) // 0
// func Equal(a, b []byte) bool
// 判断两个切片是否完全相同
fmt.Println("bytes.Equal([]byte{}, []byte{}):", bytes.Equal([]byte{}, []byte{})) // true
fmt.Println("bytes.Equal([]byte{'A'}, []byte{'a'})", bytes.Equal([]byte{'A'}, []byte{'a'})) // false
fmt.Println("bytes.Equal([]byte{}, nil):", bytes.Equal([]byte{}, nil)) // true
// func HasPrefix(s, prefix []byte) bool
// 判断s是否有前缀切片prefix
fmt.Println("bytes.HasPrefix([]byte{1, 2, 3}, []byte{1}):", bytes.HasPrefix([]byte{1, 2, 3}, []byte{1})) // true
fmt.Println("bytes.HasPrefix([]byte{1, 2, 3}, []byte{2}):", bytes.HasPrefix([]byte{1, 2, 3}, []byte{2})) // false
// func HasSuffix(s, suffix []byte) bool
// 判断s是否有后缀切片suffix,与HasPrefix类似
// func Contains(b, subslice []byte) bool
// 判断切片b是否包含子切片subslice
fmt.Println("bytes.Contains([]byte{1, 2, 3}, []byte{1}):", bytes.Contains([]byte{1, 2, 3}, []byte{1})) // true
fmt.Println("bytes.Contains([]byte{1, 2, 3}, []byte{1, 3}):", bytes.Contains([]byte{1, 2, 3}, []byte{1, 3})) // false
// func Index(s, sep []byte) int
// 子切片sep在s中第一次出现的位置,不存在则返回-1
fmt.Println("bytes.Index([]byte{1, 2, 3, 4, 5}, []byte{2, 3}):", bytes.Index([]byte{1, 2, 3, 4, 5}, []byte{2, 3})) // 1
fmt.Println("bytes.Index([]byte{1, 2, 3, 4, 5}, []byte{0, 1}):", bytes.Index([]byte{1, 2, 3, 4, 5}, []byte{0, 1})) // -1
// func IndexByte(s []byte, c byte) int
// 字符c在s中第一次出现的位置,不存在则返回-1
fmt.Println("bytes.IndexByte([]byte{1, 2, 3}, 2):", bytes.IndexByte([]byte{1, 2, 3}, 2)) // 1
fmt.Println("bytes.IndexByte([]byte{1, 2, 3}, 0):", bytes.IndexByte([]byte{1, 2, 3}, 0)) // -1
// func IndexFunc(s []byte, f func(r rune) bool) int
// s中第一个满足函数f的元素的索引,不存在则返回-1
fmt.Println("bytes.IndexFunc([]byte(\"hi go\"), func(r rune) bool {\n\t\treturn r == 'g'\n\t}):",bytes.IndexFunc([]byte("hi go"), func(r rune) bool {
return r == 'g'
})) // 3 ; hi go中g的索引为3
// func LastIndexFunc(s []byte, f func(r rune) bool) int
// 这个方法与IndexFunc相反,获取最后一个满足函数f的元素的索引,不再演示
// func LastIndex(s, sep []byte) int
// 切片sep在s中最后一次出现的位置,不存在则返回-1
fmt.Println("bytes.LastIndex([]byte(\"hi go\"), []byte(\"go\")):",bytes.LastIndex([]byte("hi go"), []byte("go"))) // 3
fmt.Println("bytes.LastIndex([]byte{1, 2, 3}, []byte{2, 3}):",bytes.LastIndex([]byte{1, 2, 3}, []byte{2, 3})) // 1
// func ToLower(s []byte) []byte
// 返回将s切片所有字符都转为小写的新切片(下面将切片转为字符串方便看到结果)
fmt.Println("string(bytes.ToLower([]byte(\"ABC\"))):",string(bytes.ToLower([]byte("ABC")))) // abc
fmt.Println("string(bytes.ToLower([]byte(\"abc\"))):",string(bytes.ToLower([]byte("abc")))) // abc
// func ToUpper(s []byte) []byte
// 这个方法将s切片字符全部转为大写,与ToLower相反,不再演示
// func Repeat(b []byte, count int) []byte
// 返回count个b切片串联起来的新切片
fmt.Println("bytes.Repeat([]byte{1, 2}, 3):",bytes.Repeat([]byte{1, 2}, 3)) // [1 2 1 2 1 2]
// func Replace(s, old, new []byte, x int) []byte
// 将s中n个old切片替换new切片,并返回这个新切片,当n为-1时,表示替换所有
fmt.Println("bytes.Replace([]byte{1, 1, 3, 1, 1, 3, 1, 1, 4}, []byte{1, 1}, []byte{0, 0}, -1):",bytes.Replace([]byte{1, 1, 3, 1, 1, 3, 1, 1, 4}, []byte{1, 1}, []byte{0, 0}, -1)) // [0 0 3 0 0 3 0 0 4]
// func ReplaceAll(s, old, new []byte) []byte
// ReplaceAll这个函数表示替换所有,与Replace中n为-1时效果是一样的
// func Map(mapping func(r rune) rune, s []byte) []byte
// 将s切片的每一个字符元素都进行mapping函数运算,并将得到的结果拼接成新切片返回
fmt.Println("string(bytes.Map(func(r rune) rune {\n\t\treturn r + 1 // 将每一个字符都+1\n\t}, []byte(\"abc\"))):",string(bytes.Map(func(r rune) rune {
return r + 1 // 将每一个字符都+1
}, []byte("abc")))) // bcd
// func Trim(s []byte, cutset string) []byte
// 返回将s前后端所有cutset值都去掉的子切片
fmt.Println("string(bytes.Trim([]byte(\"hi go hi js\"), \"hi\")):",string(bytes.Trim([]byte("hi go hi js"), "hi"))) // go hi js ; 只去除收尾hi,不会去除中间hi
// func TrimSpace(s []byte) []byte
// 将前后端所有的空白都去除,并返回新的切片
fmt.Println("bytes.TrimSpace([]byte(\" hi go \")):",bytes.TrimSpace([]byte(" hi go "))) // [104 105 32 103 111]; 只有五个字符,可以看到,去除了首尾的空字符
// func TrimLeft(s []byte, cutset string) []byte
// 返回将s左边等于cutset的值去掉的新切片
fmt.Println("string(bytes.TrimLeft([]byte(\"hihi go\"), \"hi\")):",string(bytes.TrimLeft([]byte("hihi go"), "hi"))) // go
// func TrimRight(s []byte, cutset string) []byte
// 返回将s右边等于cutset的值去掉的新切片,与TrimLeft类似不再演示
// func TrimPrefix(s, prefix []byte) []byte
// 返回将s去除prefix前缀的新切片
fmt.Println("string(bytes.TrimPrefix([]byte(\"hi go\"), []byte(\"hi\"))):",string(bytes.TrimPrefix([]byte("hi go"), []byte("hi")))) // go
// 返回将s去除suffix后缀的新切片,不再演示
// func TrimSuffix(s, suffix []byte) []byte
fmt.Println("string(bytes.TrimSuffix([]byte(\"hi go\"), []byte(\"go\"))):",string(bytes.TrimSuffix([]byte("hi go"), []byte("go")))) // hi
// func Fields(s []byte) [][]byte
// 返回将s,按照空字符切割成多个子切片
s := bytes.Fields([]byte("hi go, hi js, hi c"))
for _, v := range s {
fmt.Println(string(v)) // 依次打印 hi|go,|hi|js,|hi|c
}
// func FieldsFunc(s []byte, f func(rune) bool) [][]byte
// 与Fields类似,但是FieldsFunc是以满足函数f条件的字符为分隔符
s = bytes.FieldsFunc([]byte(" hi go, hi.js-hi c"), func(r rune) bool {
return r == ',' || r == '-' || r == '.' // 只要是,-. 都可以作为分隔符
})
for _, v := range s {
fmt.Println(string(v)) // 依次打印 hi go| hi|js,|hi c
}
// func Split(s, sep []byte) [][]byte
// 以sep作为分隔符进行分割
s = bytes.Split([]byte(" hihi go hi js hihi c"), []byte("hi"))
for _, v := range s {
fmt.Println(string(v)) // 依次打印 | | go| js| | c 注意中间的空格
}
// func SplitN(s, sep []byte, x int) [][]byte
// 以sep作为分隔符进行分割,n为分割的个数;
// x > 0 : 返回的切片最多n个子字符串;最后一个子字符串包含未进行切割的部分。
//bytes.SplitN([]byte(" hihi go hi js hihi c"), []byte("hi"))
// x == 0: 返回nil
// x < 0 : 返回所有的子字符串组成的切片
// func Join(s [][]byte, sep []byte) []byte
// 将所有的[][]byte连接成一个新切片,以sep作为连接符号
fmt.Println("bytes.Join([][]byte{{1, 1}, {2, 2}, {3, 3}}, []byte{0}):",bytes.Join([][]byte{{1, 1}, {2, 2}, {3, 3}}, []byte{0})) // [1 1 0 2 2 0 3 3]
//初始化buffer
// 第一种方式
//buffer1 := new(bytes.Buffer) // 使用new函数
// 第二种方式
//buffer2 := bytes.NewBuffer([]byte{}) // 使用bytes包的NewBuffer函数
// 第三种方式
//buffer3 := bytes.NewBufferString("") // 使用bytes包的NewBufferString函数
b := bytes.NewBufferString("abcdefgh") // 创建并初始化一个Buffer
// 打印一下内容: abcdefgh; [新方法]:func (b *Buffer) String() string => 将Buffer内容转为string
fmt.Println(b.String()) // abcdefgh
// func (b *Buffer) Len() int => 获取Buffer的长度
fmt.Println(b.Len()) // 8
// 从Buffer读取2个字节数据; [新方法]:func (b *Buffer) Next(x int) []byte => 读取n个字节数据,返回一个byte切片]
fmt.Println(string(b.Next(2))) // 读到的数据: ab
tmp := make([]byte, 2) // 新建一个大小为2的切片
// 从Buffer读取tmp大小的数据; [新方法]:func (b *Buffer) Read(p []byte) (x int, err error) => 从Buffer读取b大小的数据,返回读取的个数和可能发生的错误
n, _ := b.Read(tmp)
fmt.Println(string(tmp[:n])) // 读到的数据: cd
// 读取Buffer中的下一个字节; [新方法]:func (b *Buffer) ReadByte() (c byte, err error) => 读取并返回Buffer中的下一个字节,如果没有数据可用,返回值err为io.EOF
nextByte, _ := b.ReadByte()
fmt.Println(string(nextByte)) // 读到的数据: e
// 读取到指定的分隔符位置; [新方法]:func (b *Buffer) ReadString(delim byte) (line string, err error)
line, _ := b.ReadString('g')
fmt.Println(line) // 读到的数据: fg
fmt.Println(b.String()) // 还剩余: h
b = bytes.NewBufferString("abcdefgh") // 重新赋值
// 读取到指定的分隔符位置; [新方法]:func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) => 与ReadString不同之处,前者返回string后者返回切片
line2, _ := b.ReadBytes('b')
fmt.Println(string(line2)) // 读到的数据: ab
fmt.Println(b.String()) // 还剩余: cdefgh
// func (b *Buffer) ReadRune() (r rune, size int, err error) => ReadRune读取并返回缓冲中的下一个utf-8码值。如果没有数据可用,返回值err为io.EOF。如果缓冲中的数据是错误的utf-8编码,本方法会吃掉一字节并返回(U+FFFD, 1, nil)。
// 大多数情况下,ReadRune与ReadByte相同,ReadRune用来判断是否含有错误utf8编码数据
r, e, _ := b.ReadRune()
fmt.Println(r, e) // 99 1; c的ASCII编码为99
// func (b *Buffer) Bytes() []byte => 返回未读取的字节切片
fmt.Println(string(b.Bytes())) // defgh
fmt.Println(fmt.Sprintf("日期:%s", time.Now().Format(timetemplate)))
//buffer写入操作
b = new(bytes.Buffer) // 创建一个空的Buffer
// func (b *Buffer) WriteByte(c byte) error => 写入一个字节
b.WriteByte('a')
fmt.Println(b.String()) // a
// func (b *Buffer) Write(p []byte) (n int, err error) => 写入一个字节切片
b.Write([]byte{98, 99}) // b,c 的ASCII编码为98,99
fmt.Println(b.String()) // abc
// func (b *Buffer) WriteString(s string) (n int, err error) => 写入一个字符串
b.WriteString(" hello")
fmt.Println(b.String()) // abc hello
// func (b *Buffer) Reset() => 重设缓冲,因此会丢弃全部内容,等价于b.Truncate(0)。
b.Reset()
fmt.Println(b.Len(), b.String()) // 0
}
bytes
最新推荐文章于 2022-03-22 19:08:04 发布