go语言中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, 2, 3},
	)
	fmt.Println(string(data));
	//使用映射表将[]byte中字符修改为大写
	data = bytes.ToUpperSpecial(
		mycase,
		[]byte{1, 2, 3},
	);
	fmt.Println(string(data));
	//使用映射表将[]byte中字符修改为标题
	data = bytes.ToTitleSpecial(
		mycase,
		[]byte{1, 2, 3},
	);
	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,cd,ef"), []byte(","), 2);
	for _, 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();
}

  

时间: 2024-11-10 12:36:57

go语言中bytes包的常用函数,Reader和Buffer的使用的相关文章

go语言中regexp包中的函数和方法

// regexp.go ------------------------------------------------------------ // 判断在 b 中能否找到正则表达式 pattern 所匹配的子串 // pattern:要查找的正则表达式 // b:要在其中进行查找的 []byte // matched:返回是否找到匹配项 // err:返回查找过程中遇到的任何错误 // 此函数通过调用 Regexp 的方法实现 func Match(pattern string, b []

C语言中malloc()和calloc()c函数用法

C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小. void *calloc(size_t numElements,size_t sizeOfElement); 如果调用成功,函数mall

go语言中sync包和channel机制

文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题. sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程.更高级的同步操作通过信道与通信进行. type Co

C语言中的alloca内存分配函数

在读程序源代码时,时不时地看到alloca这个函数.一开始并没有多在意,直到今天看<<APUE>>时才留意了下. 微软MSVC提供的是_alloca. 简要说明: 它的动作方式及功能跟malloc差不多,都是内存分配.但alloca是在当前调用者函数的栈帧上分配的,而不是在堆中. 优点: 当函数返回时,自动释放该内存.无需手动释放. 缺点: 增加了栈帧的长度,而某些系统不支持增加栈帧长度,于是就不能支持alloca函数. 如果分配内存时导致栈溢出,程序的行为是未知的. 参考: Wh

c语言中,既然不支持函数重载,那么printf算怎么回事?在c语言中,它不就是被重载了吗?

这个问题问的不错.其实printf不是重载,c语言不支持函数重载 这句话是对的.printf函数是通过变长参数表实现的.你可以查看一下printf的函数原型声明.printf函数的实现在不同的机器上是不同的,但提供的接口是一致的.printf函数的正确声明形式如下:int printf(const *fmt,...)其中省略号表示参数表中参数的数量和类型是可变的.它是变长参数表的固定形式.省略号只能出现在参数表的尾部.具体的话你还是上网查查吧,我对这个原型也没研究.我想既然你能问这个问题,看点资

C语言中strcpy,strcmp,strlen,strcat函数原型

//strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char *strSrc) { char *res=strDest; assert((strDest!=NULL)&&(strSrc!=NULL)); while(*strDest)strDest++; while(*strDest=*strSrc) { strDest++; strSrc++; }

go语言中net包tcp socket的使用

一.通过socket我们模拟请求网易 package main; import ( "net" "log" "io/ioutil" "fmt" ) func chkError(err error) { if err != nil { log.Fatal(err); } } func main() { //我们模拟请求网易的服务器 //ResolveTCPAddr用于获取一个TCPAddr //net参数是"tcp4&

Go语言中Path包用法

// path package main import ( "fmt" "os" "path" "path/filepath" ) func main() { //Path操作 fmt.Println("Path操作-----------------") fmt.Println(path.Base("http://www.baidu.com/file/aa.jpg")) //aa.jpg

C语言中的static 详细分析

转自: http://blog.csdn.net/keyeagle/article/details/6708077 google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互联网上的资料整合归类,并亲手编写程序验证之. C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重