一篇文章帶你了解Go語(yǔ)言基礎(chǔ)之字節(jié)類型
前言
Hey,大家好呀,我是星期八,這次咱們繼續(xù)學(xué)習(xí)Go基礎(chǔ)之字節(jié)類型吧。
上文之字符串回顧
在上述文章中,我們學(xué)過(guò)了字符串類型。
在Go語(yǔ)言中,字符串類型是基本類型,在棧中存儲(chǔ),其結(jié)構(gòu)如下。
可以看到,在Go中,字符串其實(shí)就是指向了一個(gè)連續(xù)的內(nèi)存地址,并且記錄了長(zhǎng)度,讀取是一次性讀取出來(lái)的。
那么,如上圖所示,內(nèi)存里面存的一個(gè)個(gè)字母叫啥呢???
byte和rune類型
字符串是一個(gè)個(gè)字符拼接成的,反過(guò)來(lái),也是一個(gè)個(gè)字符拼接成的字符串,而一個(gè)個(gè)的字符,就被稱為字節(jié)(byte)。
字節(jié)占用1個(gè)字節(jié)大小,只能存字母了,標(biāo)點(diǎn)符號(hào)之類的,不能存中文。
當(dāng)然,存中文怎么辦???在Go中有一個(gè)rune,和byte類似,本質(zhì)和byte一樣,只不過(guò)rune一個(gè)占用4個(gè)字節(jié)。
rune使用utf-8編碼,可以存中文,各種語(yǔ)言。
所以,處理中文盡量用rune類型。
定義個(gè)(字節(jié))byte類型變量
字符用單引號(hào)'號(hào)包裹起來(lái)。
代碼
- package main
- import "fmt"
- func main() {
- var a byte = 'a'
- fmt.Println(a)
- }
小朋友,是否有很多疑問(wèn)???為什么是97
原因
byte代表的是一個(gè)ASCII碼的一個(gè)字符,同理,rune可以理解為是byte的一個(gè)超集,向下兼容byte。
- package main
- import "fmt"
- func main() {
- var a rune = 'a'
- fmt.Println(a)
- }
結(jié)果:
但是rune里面可以寫中文,byte不行。
byte不能存中文
rune可以存中文
發(fā)現(xiàn)了嗎,打印的竟然是一個(gè)數(shù)字?這是為啥???
就拿字母a來(lái)說(shuō),其實(shí)打印的是ASCII對(duì)應(yīng)的數(shù)字,打印的是他的十進(jìn)制。
同理,字符張也是,這里就不做例子了,因?yàn)閡tf-8表太大了。
遍歷字符串
方式一
- package main
- import "fmt"
- func main() {
- s := "我是法外狂徒,張三,hahaha"
- for _, r := range s {
- fmt.Printf("%c \n",r)
- }
- }
方式二
- package main
- import "fmt"
- func main() {
- s := "我是法外狂徒,張三,hahaha"
- for i := 0; i < len(s); i++ {
- //中文會(huì)亂碼,不推薦
- fmt.Printf("%c \n",s[i])
- }
- }
修改字符串
同理,字符串相當(dāng)于是字節(jié)列表組成的,是不能直接修改的,想要直接修改需要打散成字節(jié)列表才行。
- package main
- import "fmt"
- func main() {
- //只有英文的情況下
- s1 := "hello world"
- var s1_byte_list = []byte(s1) //打散成字符列表
- s1_byte_list[6] = 'F' //修改下表為6的字符為F
- s1 = string(s1_byte_list) //打散的字符列表在組裝成字符串
- fmt.Println(s1) //輸出 hello 6orld
- //帶有中文的情況
- s2 := "天空好像下雨,我好像住你隔壁vay"
- var s2_rune_list = []rune(s2) //打散成utf-8字符列表
- s2_rune_list[5] = '雪' //修改下表為5的字符為雪
- s2 = string(s2_rune_list) //打散的utf8字符轉(zhuǎn)字符串
- fmt.Println(s2) //輸出 天空好像下雪,我好像住你隔壁
- }
總結(jié)
上述我們學(xué)習(xí)了Go基礎(chǔ)之?dāng)?shù)據(jù)類型。如果在操作過(guò)程中有任務(wù)問(wèn)題,記得下面討論區(qū)留言,我們看到會(huì)第一時(shí)間解決問(wèn)題。
我是碼農(nóng)星期八,如果覺(jué)得還不錯(cuò),記得動(dòng)手點(diǎn)贊一下哈。感謝你的觀看。
本文轉(zhuǎn)載自微信公眾號(hào)「Go語(yǔ)言進(jìn)階學(xué)習(xí)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Go語(yǔ)言進(jìn)階學(xué)習(xí)公眾號(hào)。