日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Golang 中的 String、rune 和 byte,你了解了嗎?

來源: 責編: 時間:2023-10-26 17:12:21 302觀看
導讀解釋StringGo語言中,string就是只讀的采用utf8編碼的字節(jié)切片(slice) 因此用len函數(shù)獲取到的長度并不是字符個數(shù),而是字節(jié)個數(shù)。 for循環(huán)遍歷輸出的也是各個字節(jié)。runerune是int32的別名,代表字符的Unicode編碼,采用4個字

解釋

String

Go語言中,string就是只讀的采用utf8編碼的字節(jié)切片(slice) 因此用len函數(shù)獲取到的長度并不是字符個數(shù),而是字節(jié)個數(shù)。 for循環(huán)遍歷輸出的也是各個字節(jié)。tW728資訊網(wǎng)——每日最新資訊28at.com

rune

rune是int32的別名,代表字符的Unicode編碼,采用4個字節(jié)存儲,將string轉(zhuǎn)成rune就意味著任何一個字符都用4個字節(jié)來存儲其unicode值,這樣每次遍歷的時候返回的就是unicode值,而不再是字節(jié)了,這樣就可以解決亂碼問題了tW728資訊網(wǎng)——每日最新資訊28at.com

byte

bytes操作的對象也是字節(jié)切片,與string的不可變不同,byte是可變的,因此string按增量方式構(gòu)建字符串會導致多次內(nèi)存分配和復制,使用bytes就不會因而更高效一點tW728資訊網(wǎng)——每日最新資訊28at.com

轉(zhuǎn)換方式

String、bytes 相互轉(zhuǎn)換

String to bytes

func main() { str := "Hello, Golang!" fmt.Println(string2bytes1(str)) fmt.Println(string2bytes2(str)) fmt.Println(string2bytes3(str))}func string2bytes1(str string) []byte { bs := make([]byte, 0) for i := 0; i < len(str); i++ {  bs = append(bs, str[i]) } return bs}func string2bytes2(str string) []byte { return []byte(str)}func string2bytes3(s string) []byte { sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) bh := reflect.SliceHeader{  Data: sh.Data,  Len:  sh.Len,  Cap:  sh.Len, } return *(*[]byte)(unsafe.Pointer(&bh))}

前兩個方法是非常標準的轉(zhuǎn)換方式,第三種方式使用了 unsafe 和 reflect 處理,是個不安全的做法,而且 StringHeader 在我使用的 1.21 已經(jīng)廢棄了。tW728資訊網(wǎng)——每日最新資訊28at.com

bytes to String

func main() { str := "Hello, Golang!" bs := string2bytes3(str) fmt.Println(bytes2string1(bs)) fmt.Println(bytes2string2(bs))}func bytes2string1(bs []byte) string { return string(bs)}func bytes2string2(bs []byte) string { return *(*string)(unsafe.Pointer(&bs))}

第一種轉(zhuǎn)換也是一個非常標準的轉(zhuǎn)換方式,第二個方式使用了不安全的做法。tW728資訊網(wǎng)——每日最新資訊28at.com

String、rune 相互轉(zhuǎn)換

String to rune

func main() { str := "Hello, 中國!" fmt.Println(string2rune1(str)) fmt.Println(string2rune2(str))}func string2rune1(str string) []rune { rs := make([]rune, 0) for _, r := range str {  rs = append(rs, r) } return rs}func string2rune2(str string) []rune { return []rune(str)}

這里的 for range 和上面 for index 是不一樣的,索引字符串產(chǎn)生字節(jié)。For range 循環(huán)每次迭代都會解碼一個 UTF-8 編碼的符文,因此值類型是 rune。tW728資訊網(wǎng)——每日最新資訊28at.com

rune to String

func main() { str := "Hello, 中國!" rs := string2rune2(str) fmt.Println(rune2string1(rs))}func rune2string1(rs []rune) string { return string(rs)}

rune、bytes 相互轉(zhuǎn)換

[]rune 和 []byte 的相互轉(zhuǎn)換需要先轉(zhuǎn)成字符串再轉(zhuǎn)換。tW728資訊網(wǎng)——每日最新資訊28at.com

func main() { str := "Hello, 中國!" rs := string2rune1(str) bs := string2bytes1(str) convertedBytes := rune2bytes(rs) convertedRunes := bytes2rune(bs) fmt.Println(bs) fmt.Println(convertedBytes) fmt.Println(rs) fmt.Println(convertedRunes)}func rune2bytes(rs []rune) []byte { return []byte(string(rs))}func bytes2rune(bs []byte) []rune { return []rune(string(bs))}

總結(jié)

希望大家通過這篇文章可以鞏固自己對這幾種類型的理解,以及更方便的對它們進行轉(zhuǎn)換。tW728資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-15230-0.htmlGolang 中的 String、rune 和 byte,你了解了嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 狀態(tài)模式:對象狀態(tài)的變化,你學會了嗎?

下一篇: 純前端也可以訪問文件系統(tǒng)!

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 福建省| 高州市| 虎林市| 睢宁县| 聊城市| 小金县| 安塞县| 衡阳市| 韶山市| 南木林县| 贵德县| 周宁县| 攀枝花市| 陈巴尔虎旗| 墨脱县| 台安县| 聊城市| 灌云县| 屏南县| 潞城市| 正蓝旗| 汉沽区| 鄂托克前旗| 双鸭山市| 胶州市| 大安市| 比如县| 自治县| 惠来县| 宁都县| 府谷县| 绥江县| 青阳县| 拉萨市| 廉江市| 左贡县| 柳林县| 永州市| 西青区| 澜沧| 南靖县|