使用[]byte代替string
字符串
字符串是一系列8位字節(jié)的集合页慷,默認(rèn)初始化值為"",同時字符串的值是不可以改變的杨刨。其數(shù)據(jù)結(jié)構(gòu)為:
type stringHeader struct {
data unsafe.Pointer
len int
}
[]byte
byte是int8的別名木缝,區(qū)別于rune是int32別名。其數(shù)據(jù)結(jié)構(gòu)為:
type sliceHeader struct{
data unsafe.Pointer
len int
cap int
}
[]byte相比于string的優(yōu)點
字符串的值是不可以改變的歪架,但是字符串內(nèi)部指向數(shù)據(jù)的指針,是可以被替換的霹陡。
s := "123"
s = 456
以上在給s重新賦值456時候和蚪,會從新開辟一塊內(nèi)存止状,替換原來存儲123的內(nèi)存地址,之前分配的內(nèi)存等待系統(tǒng)gc攒霹。而對于[]byte是可以更改內(nèi)容的
s :=[]byte{1}
s=[]byte{2}
以上內(nèi)容更改不會重新開辟內(nèi)存怯疤。所以在大量字符串操作使用byte代替可以很好的優(yōu)化系統(tǒng)性能。
string相對于[]byte的好處
string是可以直接比較的催束,而[]byte不可以集峦,[]byte不可以當(dāng)作map鍵值。
善用bytes.Buffer來追加string
當(dāng)需要拼接一個字符串時候使用a+=b抠刺,連接效率底下塔淤,尤其在大量使用情況下,者導(dǎo)致大量內(nèi)存開銷和拷貝速妖,使用字符數(shù)組高蜂,用緩存向其添加
var buf bytes.Buffer
buf.WriteString(str)
fmt.Println(b.String())
但是最好的優(yōu)化,就是不優(yōu)化罕容,如果為了增加那么一丁點性能备恤,降低代碼可讀性,不如不優(yōu)化杀赢。