「Go」byte、rune與string

不積跬步,無以至千里;不積小流,無以成江海。

碼字不易,點贊再看。

byte

佔用1個節字,也就是 8 個比特位,所以它和 uint8 類型本質上沒有區別,它表示的是 ACSII 表中的一個字符。 如下這段代碼,分別定義了 byte 類型和 uint8 類型的變量 a 和 b

「Go」byte、rune與string

在 ASCII 表中,由於字母 A 的ASCII 的編號為 65 ,字母 B 的ASCII 編號為 66,所以上面的代碼也可以寫成這樣

「Go」byte、rune與string

兩段代碼輸出的結果都一樣

<code>a 的值: A 
b 的值: B
/<code>
rune

佔用4個字節,共32位比特位,所以它和 int32 本質上也沒有區別。它表示的是一個 Unicode 字符(Unicode是一個可以表示世界範圍內的絕大部分字符的編碼規範)由於 byte 類型能表示的值是有限,只有 2^8=256 個。當需要處理 中文、日文或者 其他 複合字符時,則需要用到 rune類型。

「Go」byte、rune與string

輸出:

<code>a 佔用 1 個字節數
b 佔用 4 個字節數
/<code>

不管是 byte 還是 rune ,都是使用 單引號,而沒使用 雙引號。

注意:在 Go 中單引號與 雙引號並 不等價 的。 單引號 用來表示 字符,在上面的例子裡,如果你使用雙引號,就意味著你要定義一個字符串,賦值時與前面聲明的前面會不一致,這樣在編譯的時候就會出錯。

<code> cannot use "B" (type untyped string) as type rune in assignment
/<code>

####### 疑問

byte 和 uint8 沒有區別,rune 和 int32 沒有區別,那為什麼還要多出 byte 和 rune 類型呢?不是多此一舉

理由很簡單,因為uint8 和 int32 ,直觀上讓人以為這是一個數值,但是實際上,它也可以表示一個字符,所以為了消除這種直觀錯覺,就誕生了 byte 和 rune 這兩個別名類型。

string

Go語言中的字符串以原生數據類型出現,使用字符串就像使用其他原生數據類型(int、bool、float32、float64 等)一樣。 Go 語言裡的字符串的內部實現使用UTF-8編碼。 字符串的值為雙引號(")中的內容,可以在Go語言的源碼中直接添加非ASCII碼字符,例如:

<code>s1 := "hello"
s2 := "你好"
/<code>

golang中的字符串底層實際上是一個 byte數組。因此可能會出現下面這種情況

<code>str := "hello 世界"
fmt.Println(len(str)) //輸出 12
/<code>

我們期望得到的結果應該是8,原因是golang中的string底層是由一個byte數組實現的,而golang默認的編碼是utf-8,一箇中文字符佔 3個字節,所以得到的長度是12,想要得到我們想要的結果也很簡單,golang中的unicode/utf8包提供了用utf-8獲取長度的方法

<code>str := "hello 世界"
fmt.Println(utf8.RuneCountInString(str)) //8
/<code>

上面說了byte類型實際上是一個int8類型,int8適合表達ascii編碼的字符,而int32可以表達更多的數,可以更容易的處理unicode字符,因此,我們可以通過rune類型來處理unicode字符

<code>str := "hello 世界"
str2 := []rune(str)
fmt.Println(len(str2)) //8
/<code>

這裡會將申請一塊內存,然後將str的內容複製到這塊內存,實際上這塊內存是一個rune類型的切片,而str2拿到的是一個rune類型的切片的引用,我們可以很容易的證明這是一個引用

<code>str := "hello 世界"
str2 := []rune(str)
t := str2
t[0] = 'w'
fmt.Println(string(str2)) //“wello 世界”
/<code>

通過把str2賦值給t,t上改變的數據,實際上是改變的是t指向的rune切片,因此,str也會跟著改變

字符串的遍歷
「Go」byte、rune與string

「Go」byte、rune與string

修改字符串

要修改字符串,需要先將其轉換成[]rune或[]byte,完成後再轉換為string。無論哪種轉換,都會重新分配內存,並複製字節數組。

「Go」byte、rune與string

字符串轉義符

Go 語言的字符串常見轉義符包含回車、換行、單雙引號、製表符等,如下表所示。


「Go」byte、rune與string

例如:

<code>package main
import (
    "fmt"
)
func main() {
    fmt.Println("str := "d:\\Code\\work\\go.exe"")
}
/<code>
多行字符串

Go語言中要定義一個多行字符串時,就必須使用反引號字符:

<code>s1 := `第一行
        第二行
        第三行
        `
fmt.Println(s1)
/<code>

反引號間換行將被作為字符串中的換行,但是 所有 的轉義字符均無效,文本將會原樣輸出。

字符串的常用操作


「Go」byte、rune與string

點關注 不迷路

如果你從本篇內容有收穫,求 點贊,求 關注,求 轉發 ,讓更多的人學習到。

如果本文有任何錯誤,請批評指教,不勝感激


分享到:


相關文章: