bytes

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
}

搬运文章链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值