中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言字符類型byte與rune源碼分析

發布時間:2023-03-01 15:57:01 來源:億速云 閱讀:80 作者:iii 欄目:開發技術

這篇文章主要介紹“go語言字符類型byte與rune源碼分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“go語言字符類型byte與rune源碼分析”文章能幫助大家解決問題。

一、byte類型介紹

byte 類型是 uint8 的別名,可以表達只占用 1 個字節的傳統 ASCII 編碼的字符,例如 var c byte = 'A'

用單引號括起來的單個字符是字符類型,用雙引號括起來的字符是字符串類型

package main

import "fmt"

func main(){
    var c byte = 'A'
    fmt.Println(c)
    fmt.Printf("%T ",c)
    fmt.Printf("\n")
    var d rune = 'A'
    fmt.Println(d)
    fmt.Printf("%T ",d)
    // var e byte = 'AB' // more than one character in rune literal
    // var e rune = 'AB'  // more than one character in rune literal
    var e string = "AB"
    fmt.Println(e)
    fmt.Printf("%T ",e)
    fmt.Printf("\n")
    var f byte = 'C'
    println(f)
    f = 88
    println(f)
}

// 結果如下
65
uint8 
65
int32 
AB
string 
67
88

二、rune類型介紹

  • 在書寫 Unicode 字符時,需要在 16 進制數之前加上前綴\u或者\U

  • Unicode 至少占用 2 個字節,所以我們使用 int16 或者 int 類型來表示。

  • 需要使用到 4 字節,則使用\u前綴,如果需要使用到 8 個字節,則使用\U前綴。

var h int = '\u0041'
fmt.Println(h)   // 65
var i int = '\U00000041'
fmt.Println(i)   // 65

三、遍歷含有中文(Unicode)時差異

3.1、遍歷打印一個字符串,當使用byte類型時:
package main

import "fmt"

func main(){
    str:="hello 世界"
    for i:=0;i<len(str);i++{
        fmt.Printf("%c",str[i]) // hello ???
        fmt.Printf("\n")
    }
}

// 結果如下:
h
e
l
l
o
 
?
?

?

上面結果,英文字符正確打印,但中文亂碼。是因為UTF8編碼下一個中文漢字由3~4個字節組成,而字符串是由byte字節組成,所以長度也是byte字符長度,這樣遍歷時遇到中文就亂碼了。

3.2、使用rune 類型來遍歷字符串

在 Go 中,有一個遍歷方式是 range,它默認就是以 UTF-8 編碼形式去讀每一個字符。當涉及到的字符串中含有非英文字符時,可以使用 range 來遍歷:

104
101
108
108
111
32
19990
30028

此時輸出的字節編碼就是 UTF-8 編碼號,UTF-8 編碼是包含 ASCII 編碼的,所以前 6 個編號還是一樣的,后面兩個編號分別代表世,界。

四、go 語言字符串修改

所謂對字符串的修改其實不是對字符串本身的修改,而是復制字符串,同時修改值,即重新分配來內存。

在go中修改字符串,需要先將字符串轉化成數組,[]byte[]rune,然后再轉換成 string型。

4.1、對于全是ASCII編碼的字符串:
package main

import "fmt"

func main(){
    str:="hello"
    fmt.Println(str)
    s1:=[]byte(str)
    s1[0]='H'
    fmt.Println(string(s1))
}

// 結果如下
hello
Hello
4.2、對于包含非ASCII編碼的字符串:
package main

import "fmt"

func main(){
    str01:="hello 世界"
    fmt.Println(str01)
    s2:=[]rune(str01)
    s2[0]='H'
    fmt.Println(string(s2))
}

// 結果如下
hello 世界
Hello 世界

關于“go語言字符類型byte與rune源碼分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东山县| 通州市| 房山区| 昌吉市| 五华县| 桃江县| 临安市| 伊宁市| 钟祥市| 贵定县| 霞浦县| 阿图什市| 石台县| 丹棱县| 镇宁| 蕲春县| 株洲县| 峨山| 杭州市| 荃湾区| 牙克石市| 沛县| 易门县| 商城县| 调兵山市| 财经| 友谊县| 崇州市| 桑植县| 如皋市| 伊金霍洛旗| 鲜城| 田林县| 绥棱县| 佛山市| 孟连| 浦北县| 屏山县| 太湖县| 聂拉木县| 咸宁市|