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)
}