【golang】性能优化--字符串
2020-08-04 本文已影响0人
dongzd
使用[]byte代替string
字符串
字符串是一系列8位字节的集合,默认初始化值为"",同时字符串的值是不可以改变的。其数据结构为:
type stringHeader struct {
data unsafe.Pointer
len int
}
[]byte
byte是int8的别名,区别于rune是int32别名。其数据结构为:
type sliceHeader struct{
data unsafe.Pointer
len int
cap int
}
[]byte相比于string的优点
字符串的值是不可以改变的,但是字符串内部指向数据的指针,是可以被替换的。
s := "123"
s = 456
以上在给s重新赋值456时候,会从新开辟一块内存,替换原来存储123的内存地址,之前分配的内存等待系统gc。而对于[]byte是可以更改内容的
s :=[]byte{1}
s=[]byte{2}
以上内容更改不会重新开辟内存。所以在大量字符串操作使用byte代替可以很好的优化系统性能。
string相对于[]byte的好处
string是可以直接比较的,而[]byte不可以,[]byte不可以当作map键值。
善用bytes.Buffer来追加string
当需要拼接一个字符串时候使用a+=b,连接效率底下,尤其在大量使用情况下,者导致大量内存开销和拷贝,使用字符数组,用缓存向其添加
var buf bytes.Buffer
buf.WriteString(str)
fmt.Println(b.String())
但是最好的优化,就是不优化,如果为了增加那么一丁点性能,降低代码可读性,不如不优化。