一篇文章帶你瞭解 Go 語言基礎之字節類型

前言

Hey,大家好呀,我是星期八,這次咱們繼續學習 Go 基礎之字節類型吧。

上文之字符串回顧

在上述文章中,我們學過了字符串類型。

在 Go 語言中,字符串類型是基本類型,在棧中存儲,其結構如下。

可以看到,在 Go 中,字符串其實就是指向了一個連續的內存地址,並且記錄了長度,讀取是一次性讀取出來的。

那麼,如上圖所示,內存裏面存的一個個字母叫啥呢???

byte 和 rune 類型

字符串是一個個字符拼接成的,反過來,也是一個個字符拼接成的字符串,而一個個的字符,就被稱爲字節 (byte)。

字節佔用 1 個字節大小,只能存字母了,標點符號之類的,不能存中文。

當然,存中文怎麼辦??? 在 Go 中有一個rune,和byte類似,本質和byte一樣,只不過rune一個佔用 4 個字節。

rune使用utf-8編碼,可以存中文,各種語言。

所以,處理中文儘量用rune類型。

定義個 (字節)byte 類型變量

字符用單引號'號包裹起來。

代碼

package main
import "fmt"
func main() {
    var a byte = 'a'
    fmt.Println(a)
}

小朋友,是否有很多疑問??? 爲什麼是 97

原因

byte代表的是一個ASCII碼的一個字符,同理,rune可以理解爲是byte的一個超集,向下兼容byte

package main
import "fmt"
func main() {
    var a rune = 'a'
    fmt.Println(a)
}

結果:

但是rune裏面可以寫中文,byte不行。

byte 不能存中文

rune 可以存中文

發現了嗎,打印的竟然是一個數字? 這是爲啥???

就拿字母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 基礎之數據類型。如果在操作過程中有任務問題,記得下面討論區留言,我們看到會第一時間解決問題。

我是碼農星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/rTc3pzBAMwsntKYo4AZ9Pw