GO语言常用工具类收藏

GoLang是一门神奇的语言,但是他自身提供的工具包却不是很多,包括我在用的时候也需要去百度一下对应的,常用的如下:

字符串类

1、截取字符串

//截取字符串 start 起点下标 length 需要截取的长度
func Substr(str string, start int, length int) string {
	rs := []rune(str)
	rl := len(rs)
	end := 0

	if start < 0 {
		start = rl - 1 + start
	}
	end = start + length

	if start > end {
		start, end = end, start
	}

	if start < 0 {
		start = 0
	}
	if start > rl {
		start = rl
	}
	if end < 0 {
		end = 0
	}
	if end > rl {
		end = rl
	}

	return string(rs[start:end])
}

子串在字符串出现的位置

func UnicodeLastIndex(str,substr string) int {
	// 子串在字符串的字节位置
	result := strings.LastIndex(str,substr)
	if result >= 0 {
		// 获得子串之前的字符串并转换成[]byte
		prefix := []byte(str)[0:result]
		// 将子串之前的字符串转换成[]rune
		rs := []rune(string(prefix))
		// 获得子串之前的字符串的长度,便是子串在字符串的字符位置
		result = len(rs)
	}
	return result
}



func UnicodeIndex(str,substr string) int {
	// 子串在字符串的字节位置
	result := strings.LastIndex(str,substr)
	if result >= 0 {
		// 获得子串之前的字符串并转换成[]byte
		prefix := []byte(str)[0:result]
		// 将子串之前的字符串转换成[]rune
		rs := []rune(string(prefix))
		// 获得子串之前的字符串的长度,便是子串在字符串的字符位置
		result = len(rs)
	}
	return result
}

TCP粘包和拆包解决办法

func Encode(message string)([]byte ,error){
	//int32占用4位内存字节 ,
	var length  = int32(len(message))
	//定义一个缓存区
	var pkg = new(bytes.Buffer)
	//把length写入到缓存区
	err := binary.Write(pkg,binary.BigEndian,length)
	//如果错误就返回
	if err != nil{
		return nil,err
	}
	//把要发送的消息写入到缓冲区
	err = binary.Write(pkg,binary.BigEndian,[]byte(message))
	if err != nil{
		return nil,err
	}
	//返回已经写好的byte数组
	return pkg.Bytes(),nil
}

func Decode(reader *bufio.Reader)(string,error){
	// 读取前四个字节的数据,为数据包的长度
	lengthByte,_ := reader.Peek(4)
	//申明一个缓冲区,长度为4
	lengthBuff := bytes.NewBuffer(lengthByte)
	//申明一个变量,用来接受数据的长度
	var length int32
	//把数据的长度读取到length
	err := binary.Read(lengthBuff,binary.BigEndian,&length)
	if err != nil{
		return "" ,nil
	}
	//如果总的字节数 <= length + 4,说明数据读取错误
	if int32(reader.Buffered()) < length + 4 {
		return "",err
	}

	//读取全部的数据
	peak := make([]byte,int(4+length))
	_, err = reader.Read(peak)
	if err != nil{
		return "",err
	}
	//返回除了前四位的数据
	return string(peak[4:]),nil
}

int和byte的相互转换

func IntToBytes(n int) []byte {
	data := int64(n)
	bytebuf := bytes.NewBuffer([]byte{})
	binary.Write(bytebuf, binary.BigEndian, data)
	return bytebuf.Bytes()
}

func BytesToInt(bys []byte) int {
	bytebuff := bytes.NewBuffer(bys)
	var data int64
	binary.Read(bytebuff, binary.BigEndian, &data)
	return int(data)
}
发布了106 篇原创文章 · 获赞 101 · 访问量 56万+

猜你喜欢

转载自blog.csdn.net/qq_24434671/article/details/103988417
今日推荐