在上述文章中,我們學過了字串型別。
在Go語言中,字串型別是基本型別,在堆疊中存儲,其結構如下。
可以看到,在Go中,字串其實就是指向了一個連續的記憶體位址,並且記錄了長度,讀取是一次讀取出來的。
那麼,如上圖所示,記憶體裡面存的一個個#叫啥呢? ? ?
字串是#一個字元##拼接成的,反過來,也是一個個字符拼接成的字串,而一個個的字符,而稱為位元組(byte)。
位元組佔用1個位元組大小,只能存字母了,標點符號之類的,不能存中文。
當然,存中文怎麼辦???在Go中有一個#rune,和 byte
類似,本質和byte
一樣,只不過rune
一個佔用4個位元組。
rune使用utf-8
編碼,可以存中文,各種語言。
所以,處理中文盡量用rune
#類型。
字元用單引號'
號包裹起來。
程式碼
package main import "fmt" func main() { var a byte = 'a' fmt.Println(a) }
原因
byte
代表的是一个ASCII
码的一个字符,同理,rune
可以理解为是byte
的一个超集,向下兼容byte
。
package main import "fmt" func main() { var a rune = 'a' fmt.Println(a) }
结果:
但是rune
里面可以写中文,byte
不行。
发现了吗,打印的竟然是一个数字?这是为啥???
就拿字母a
来说,其实打印的是ASCII
对应的数字,打印的是他的十进制。
同理,字符张
也是,这里就不做例子了,因为utf-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++ { //中文会乱码,不推荐 fmt.Printf("%c \n",s[i]) } }
同理,字符串相当于是字节列表组成的,是不能直接修改的,想要直接修改需要打散成字节列表才行。
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字符转字符串 fmt.Println(s2) //输出 天空好像下雪,我好像住你隔壁 }
以上是一篇文章帶你了解Go語言基礎之位元組類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!