string
1 .是一個指針贷腕,指向某個數(shù)組的首地址
[]byte
1 .是一個切片slice咬展。一個封裝了數(shù)組的結(jié)構(gòu)體
2 .slice結(jié)構(gòu)
type slice struct {
array unsafe.Pointer
len int
cap int
使用場景
1 .想要在本身原地修改破婆,就只能使用[]byte
2 .string不能為nil,想要返回nil表達特殊含義,只能使用[]byte
3 .string可以直接比較瀑梗,而[]byte不可以,所以[]byte不可以當map的key值抛丽。
4 .因為無法修改string中的某個字符,需要粒度小到操作一個字符時允蜈,用[]byte
5 .[]byte切片這么靈活蒿柳,想要用切片的特性就用[]byte
6 .需要大量字符串處理的時候用[]byte垒探,性能好很多
區(qū)別
1 .string的指針指向的內(nèi)容是不可以改變的,所以每次更改一次字符串仔引,都需要重新分配內(nèi)存褐奥。之前的內(nèi)存還需要GC收回,這是導致string效率底下的根本原因
2 .如果我們保存的字符在 ASCII 表的,比如[0-1, a-z,A-Z..]直接可以保存到 byte
3 .如果我們保存的字符對應碼值大于 255,這時我們可以考慮使用 int 類型保存
string,byte,rune的區(qū)別
1.string:只讀的采用utf8編碼的字節(jié)切片儿倒,因此len獲得的長度并不是字符個數(shù)呜笑,而是字節(jié)個數(shù)
2.rune是int32的別名,代表字符的unicode編碼凰慈,采用4個字節(jié)存儲驼鹅。將string轉(zhuǎn)為rune就意味著任何一個字符都采用4個字節(jié)來存儲unicode值,這樣每次遍歷返回的時候就是返回unicode值豺型,而不是字節(jié)买乃,解決亂碼的問題
1 .通過for range對字符串進行遍歷時剪验,每次獲取到的對象都是rune類型的
2 .
3 .byte:字節(jié)切片前联,可變的
1 .使用string按增量方式構(gòu)建字符串會導致多次內(nèi)存分配和復制抖韩,但是使用bytes就不會,因此更加高效
3.utf8和unicode區(qū)別
1 .ascii:128個英文字符對應的二進制編碼
2 .非ascii編碼:其他語言:中文双谆,法語席揽,德語。需要用多個字節(jié)表示一個符號
3 .unicode:把所有的符號都納入其中幌羞,每一個符號都給予獨一無二的編碼
4 .問題:Unicode有多種存儲方式寸谜,對應很多的二進制格式,存儲有很大的浪費属桦,英文需要一個字節(jié)熊痴,漢字需要好幾個字節(jié),如果都是這樣的話聂宾,那么會有很大的浪費
5 .utf8:utf8是unicode的實現(xiàn)方式之一,是一種變長的編碼方式果善。根據(jù)不同的符號而變化字節(jié)長度
6 .
string,數(shù)組和切片的實現(xiàn)與區(qū)別
1 .這三種數(shù)據(jù)類型,在底層有相同的內(nèi)存結(jié)構(gòu)系谐,在上層巾陕,因為語法的限制而有不同的行為表現(xiàn)
2 .數(shù)組
1 .數(shù)組是一種值類型,雖然數(shù)組的元素可以被修改纪他,但是復制和函數(shù)傳參都是整體復制的方式處理
2 .
3 .字符串
1 .字符串的底層也是對應的字節(jié)數(shù)組
2 .字符串的只讀屬性禁止了在程序種對底層字節(jié)數(shù)組的元素的修改
3 .字符串賦值只是服是了數(shù)據(jù)地址和對應的長度鄙煤,并不會導致底層數(shù)據(jù)的復制
4 .切片
1 .切片的結(jié)構(gòu)和字符串類似茶袒,只是解除了只讀限制
2 .