golang语言中bytes包的常用函数,Reader和Buffer的使用

bytes中常用函数的使用:

package main;

import (
	"bytes"
	"fmt"
	"unicode"
)

//bytes包中实现了大量对[]byte操作的函数和两个最主要的Reader和Buffer两个结构

func main() {
	str := "aBcD";
	//转为小写
	fmt.Println(string(bytes.ToLower([]byte(str))));
	//转为大写
	fmt.Println(string(bytes.ToUpper([]byte(str))));
	//转为标题,
	fmt.Println(string(bytes.ToTitle([]byte(str))));

	//自定义映射表
	mycase := unicode.SpecialCase{
		unicode.CaseRange{
			//1,1表示替换规则只影响1到1之间的字符
			1,1,[unicode.MaxCase]rune{
				//大写转换
				'壹' - 1,//小写转换
				'一' - 1,//标题转换
				'小' - 1,},unicode.CaseRange{
			2,2,[unicode.MaxCase]rune{
				'贰' - 2,'二' - 2,'中' - 2,unicode.CaseRange{
			3,3,[unicode.MaxCase]rune{
				'叁' - 3,'三' - 3,'大' - 3,};
	//使用映射表将[]byte中字符修改为小写
	data := bytes.ToLowerSpecial(
		mycase,[]byte{1,3},)
	fmt.Println(string(data));
	//使用映射表将[]byte中字符修改为大写
	data = bytes.ToUpperSpecial(
		mycase,);
	fmt.Println(string(data));
	//使用映射表将[]byte中字符修改为标题
	data = bytes.ToTitleSpecial(
		mycase,);
	fmt.Println(string(data));

	//将[]byte中单词首字符修改为Title并返回
	fmt.Println(string(bytes.Title([]byte("abc def"))));

	//比较两个[]byte,
	// a < b 返回 -1
	// a == b 返回 0
	// b > b 返回 1
	fmt.Println(bytes.Compare([]byte("a"),[]byte("b")));

	//比较两个[]byte是否相等
	fmt.Println(bytes.Equal([]byte("abc"),[]byte("abc")));

	//比较两个[]byte是否相等,忽略大写,小写,标题
	fmt.Println(bytes.EqualFold([]byte("ABC"),[]byte("abc")));

	//去掉[]byte两边包含在cutset中的字符
	fmt.Println(string(bytes.Trim([]byte(" abc ")," ")));

	//去掉左边包含在cutset中的字符
	fmt.Println(string(bytes.TrimLeft([]byte(" abc ")," ")));

	//去掉右边包含在cutset中的字符
	fmt.Println(string(bytes.TrimRight([]byte(" abc ")," ")));

	//去掉两边空白字符
	fmt.Println(string(bytes.TrimSpace([]byte(" abc "))));

	//去掉前缀
	fmt.Println(string(bytes.TrimPrefix([]byte("tb_user"),[]byte("tb_"))));

	//去掉后缀
	fmt.Println(string(bytes.TrimSuffix([]byte("user_idx"),[]byte("_idx"))));

	//以sep为分隔符,切分为多个[]byte
	tmp := bytes.Split([]byte("ab cd ef"),[]byte(" "));
	for _,v := range tmp {
		fmt.Println(string(v));
	}

	//分割最多n个子切片,超出n的部分将不进行切分
	tmp = bytes.SplitN([]byte("ab cd ef"),[]byte(" "),2);
	for _,v := range tmp {
		fmt.Println(string(v));
	}

	//以sep为分隔符,切分为多个[]byte,结果包含分隔符,在子串尾部
	tmp = bytes.SplitAfter([]byte("ab,cd,ef"),[]byte(","));
	for _,v := range tmp {
		fmt.Println(string(v));
	}

	//分割最多n个子切片,超出n的部分将不进行切分
	tmp = bytes.SplitAfterN([]byte("ab,"),v := range tmp {
		fmt.Println(string(v));
	}

	//以空白字符切分
	tmp = bytes.Fields([]byte("a b c d"));
	for _,v := range tmp {
		fmt.Println(string(v));
	}

	//以符合函数的字符作为分隔符来切分
	tmp = bytes.FieldsFunc([]byte("asbscsd"),func(r rune) bool {
		if r == rune('s') {
			return true;
		}
		return false;
	});
	for _,v := range tmp {
		fmt.Println(string(v));
	}

	//以sep为连接符,拼接[][]byte
	fmt.Println(string(bytes.Join(
		[][]byte{
			[]byte("aa"),[]byte("bb"),[]byte("cc"),[]byte("-"),)));

	//重复[]byte,Count次
	fmt.Println(string(bytes.Repeat([]byte("abc"),3)));

	//判断是否有前缀
	fmt.Println(bytes.HasPrefix([]byte("is_true"),[]byte("is_")));

	//判断是否有后缀
	fmt.Println(bytes.HasSuffix([]byte("chk_on"),[]byte("_on")));

	//判断是否包含某个[]byte
	fmt.Println(bytes.Contains([]byte("i am jack"),[]byte("jack")));

	//判断是否包含某个rune
	fmt.Println(bytes.ContainsRune([]byte("i from 中国"),rune('中')));

	//查找sep在参数一中第一次出现的位置,找不到返回-1
	fmt.Println(bytes.Index([]byte("abcabc"),[]byte("a")));
	fmt.Println(bytes.IndexByte([]byte("cba"),'a'));
	fmt.Println(bytes.IndexRune([]byte("i from 中国"),rune('中')));

	//查找chars中任意一个字符在参数一中出现的位置,找不到返回-1
	fmt.Println(bytes.IndexAny([]byte("hello world"),"xy"));

	//功能同上,只不过查找最后一次出现的位置
	fmt.Println(bytes.LastIndex([]byte("abcabc"),[]byte("a")));
	fmt.Println(bytes.LastIndexByte([]byte("cba"),'a'));
	fmt.Println(bytes.LastIndexAny([]byte("hello world"),"xy"));

	//获取sep中在参数一中出现的次数
	fmt.Println(bytes.Count([]byte("a|b|c"),[]byte("|")));

	//将参数一中前n个old替换成new,n小于0则全部替换。
	fmt.Println(string(
		bytes.Replace(
			[]byte("i am jack"),[]byte("i am"),[]byte("我是"),-1,),));

	//将[]byte中的字符替换为函数的返回值,如果返回值为负数,则丢弃访字符。
	fmt.Println(string(
		bytes.Map(
			func(r rune) rune {
				if r == 'a' {
					return 'A';
				} else if r == 'c' {
					return -1;
				}
				return r;
			},[]byte("abcd"),));

	//将[]byte转换为[]rune
	fmt.Println(string(bytes.Runes([]byte("我是谁"))));
}

bytes中Reader和Buffer的使用:

package main;

import (
	"bytes"
	"fmt"
)

//bytes中Reader和Buffer两个结构的使用

func useReader() {
	data := "abcdefghijk";
	//通过[]byte创建Reader
	re := bytes.NewReader([]byte(data));
	//返回未读取部分的长度
	fmt.Println("re len : ",re.Len());
	//返回底层数据总长度
	fmt.Println("re size : ",re.Size());

	buf := make([]byte,2);
	for {
		//读取数据
		n,err := re.Read(buf);
		if err != nil {
			break;
		}
		fmt.Println(string(buf[:n]));
	};

	//设置偏移量,因为上面的操作已经修改了读取位置等信息
	re.Seek(0,0);
	for {
		//一个字节一个字节的读
		b,err := re.ReadByte();
		if err != nil {
			break;
		}
		fmt.Println(string(b));
	}

	re.Seek(0,0);
	off := int64(0);
	for {
		//指定偏移量读取
		n,err := re.ReadAt(buf,off);
		if err != nil {
			break;
		}
		off += int64(n);
		fmt.Println(off,string(buf[:n]));
	}
}

func useBuffer() {
	data := "123456789";
	//通过[]byte创建一个Buffer
	bf := bytes.NewBuffer([]byte(data));

	//Len()返回未读取的数据长度
	fmt.Println("bf len : ",bf.Len());

	//Cap()缓存容量
	fmt.Println("bf cap : ",bf.Cap());

	//Bytes()返回未读取的数据切片
	bys := bf.Bytes();
	for _,v := range bys {
		fmt.Print(string(v) + " ");
	}
	fmt.Println();

	//Next()返回未读取部分前n字节数据的切片
	for i := 0; i < 10; i++ {
		tmp := bf.Next(1);
		fmt.Print(string(tmp) + " ");
	}
	fmt.Println();
	//再次Next,返回[]byte,说明没有未读取的
	fmt.Println(bf.Next(1));

	//重设缓冲,丢弃全部内容
	bf.Reset();

	//通过string创建Buffer
	bf2 := bytes.NewBufferString(data);
	//读取第一个 delim 及其之前的内容,返回遇到的错误
	line,_ := bf2.ReadBytes('3');
	fmt.Println(string(line));
	//效果同上,返回string
	line2,_ := bf2.ReadString('7');
	fmt.Println(line2);

	//创建一个空Buffer
	bf3 := bytes.Buffer{};
	//自动增加缓存容量,保证有n字节剩余空间
	bf3.Grow(16);
	//写入rune编码,返回写入的字节数和错误。
	n,_ := bf3.WriteRune(rune('中'));
	fmt.Println("bf3 write ",n);
	n,_ = bf3.WriteString("国人");
	fmt.Println("bf3 write ",n);
	//返回未读取的字符串
	fmt.Println(bf3.String());
	//将数据长度截断到n字节
	bf3.Truncate(6);
	fmt.Println(bf3.String());
}

func main() {
	//防止main中代码过多,我新建两个函数单独写
	useReader();
	useBuffer();
}

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


类型转换 1、int转string 2、string转int 3、string转float 4、用户结构类型转换
package main import s &quot;strings&quot; import &quot;fmt&quot; var p = fmt.Println func main() { p(&quot;Contains: &quot;, s.Contains(&quot;test&quo
类使用:实现一个people中有一个sayhi的方法调用功能,代码如下: 接口使用:实现上面功能,代码如下:
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件信息 4、删除文件,成功返回true,失败返回false
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/intro/ 安装步骤: 一、GO环境安装 二、配置系统变量 三、Beego安装 一、GO环境安装 根
golang获取程序运行路径:
Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考