最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中rune和byte的使用與區(qū)別

 更新時間:2025年02月17日 09:33:16   作者:李歘歘  
rune和byte都是Go語言中表示單個字符的類型,本文就來介紹一下Golang中rune和byte的使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下

在Go語言中,runebyte都是表示單個字符的類型,但它們有一些關鍵的區(qū)別。

byte 類型

byte 是 uint8 的別名,即一個 8 位無符號整數,表示一個字節(jié),范圍是 0 到 255。

  • byte 用于表示 UTF-8 編碼中的 字節(jié),適合處理字節(jié)流和 ASCII 字符。

字符占用字節(jié)數:

  • ASCII 字符(0-127)占用 1 字節(jié)。
  • 常見的字符,如拉丁字母、標點符號,占用 1 字節(jié)。
  • 中文等非 ASCII 字符會占用 3 字節(jié)。

byte 表示:字符串 "你",它在 Go 中的 UTF-8 編碼是 0xE4, 0xBD, 0xA0(十六進制)。

s := "你"
for i := 0; i < len(s); i++ {
    fmt.Printf("byte at index %d: %d\n", i, s[i])
}

輸出:

byte at index 0: 228
byte at index 1: 189
byte at index 2: 160

rune 類型

rune 是 int32 的別名,即一個 32 位有符號整數,用于表示一個 Unicode 字符。Go中所有字符(包括 ASCII 和 Unicode 字符)都是以 rune 類型表示的,范圍是 0 到 0x10FFFF。

  • rune 用于表示 Unicode 字符,它表示字符的 編碼點,適合處理字符操作,尤其是涉及 Unicode 字符(如中文、表情符號等)。

rune 表示:

s := "你"
for _, c := range s {
    fmt.Printf("rune: %c, rune value: %d\n", c, c)
}

輸出:

rune: 你, rune value: 20320

這表示 "你" 的 Unicode 編碼點(20320,即 0x4F60)被 rune 類型存儲。

UTF-8 與 Unicode 的關系

  • Unicode 是字符集,而 UTF-8 是 Unicode 字符集的編碼方式之一。Unicode 定義了所有字符的編碼點,但它并沒有規(guī)定字符如何存儲和傳輸。為了實現跨平臺和跨語言的兼容,UTF-8 被定義為一種將 Unicode 編碼點轉換為字節(jié)序列的方式。除了 UTF-8 外,還有 UTF-16 和 UTF-32。
  • 聯系
    • Unicode 為每個字符分配一個編碼點(一個數字)。
    • UTF-8 通過不同長度的字節(jié)序列來編碼這些 Unicode 編碼點,使得它們可以被存儲在文件中、傳輸通過網絡、顯示在屏幕上等。

byte和rune的主要區(qū)別

特性byterune
類型uint8 (8-bit unsigned int)int32 (32-bit signed int)
用途處理 ASCII 或字節(jié)數據處理 Unicode 字符
表示范圍0 到 2550 到 0x10FFFF
常見應用字節(jié)流、ASCII字符Unicode字符(包括多字節(jié)字符)
存儲大小1 字節(jié)4 字節(jié)
字符集支持僅支持 ASCII 字符支持所有 Unicode 字符

Go的默認編碼方式

Go 字符串默認的編碼方式是 UTF-8 。所以默認使用 byte 序列來表示字符串中的每個字符。

具體來說,Go 中的字符串(string 類型)是由 UTF-8 編碼的字節(jié)序列 組成的。因此:

  • 一個 Go 字符串是由多個字節(jié)(byte)組成的,每個字節(jié)都是 UTF-8 編碼的一個字符。
  • 這些字節(jié)遵循 UTF-8 編碼,Go 字符串既可以包含 ASCII 字符(這些字符在 UTF-8 中占用 1 個字節(jié)),也可以包含多字節(jié)的 Unicode 字符(如中文字符,這些字符在 UTF-8 中通常占用 3 個字節(jié))。
s := "a"
fmt.Print("占用字節(jié)數:", len(s))
fmt.Printf(";類型:%T  ", s[0])
fmt.Println()
s1 := "你"
fmt.Print("占用字節(jié)數:", len(s1))
fmt.Printf(";類型:%T  ", s1[0])

輸出:

占用字節(jié)數:1;類型:uint8  
占用字節(jié)數:3;類型:uint8  

遍歷方式

遍歷 byte

bytes := []byte(s)可以直接將字符串轉為byte,當然也可以遍歷:

  • 使用 for i := 0; i < len(s); i++,每次迭代都可以訪問字符串中的每個字節(jié)。
  • len(s) 返回字符串的 字節(jié)數(byte),即字符串中包含的字節(jié)總數,而不是字符的數量。對于一個包含多字節(jié)字符(如中文字符)的字符串,len(s) 返回的是字符串所占用的字節(jié)數。
package main

import "fmt"

func main() {
	s := "你" // 包含中文字符

	// 按字節(jié)遍歷字符串
	fmt.Println("按字節(jié)遍歷字符串:")
	for i := 0; i < len(s); i++ {
		fmt.Printf("s[%d] = %v (類型: %T)\n", i, s[i], s[i]) // 輸出每個字節(jié)的值
	}
}

輸出:

按字節(jié)遍歷字符串:
s[0] = 228 (類型: uint8)
s[1] = 189 (類型: uint8)
s[2] = 160 (類型: uint8)

遍歷 rune

runes := []rune(s)可以直接將字符串轉為rune,當然也可以遍歷:

  • 使用 for _, c := range s 遍歷字符串時,Go 會自動將字符串 s 中的每個字符解碼成 rune 類型,這樣即使字符是多字節(jié)的,也能正確處理。

  • range 遍歷字符串時,按 字符(rune) 進行迭代。每次迭代返回一個 Unicode 碼點(rune) 和該字符在字符串中的索引。對于多字節(jié)字符,range 會自動跳過這些字節(jié),按字符來迭代。

package main

import "fmt"

func main() {
	s := "你"

	// len(s) 返回字節(jié)數
	fmt.Println("len(s) =", len(s)) // 輸出:3,因為“你”是由 3 個字節(jié)表示

	// 使用 range 遍歷字符串,按字符(rune)遍歷
	fmt.Println("使用 range 遍歷字符串,按字符(rune)遍歷:")
	for i, r := range s {
		fmt.Printf("i = %d, r = %v (類型: %T)\n", i, r, r)
	}
}

輸出:

len(s) = 3
使用 range 遍歷字符串,按字符(rune)遍歷:
i = 0, r = 20320 (類型: int32)

補充

for i := range s 的 s[i] 其實也是byte,但是處理中文時候會存在問題。

  • 當你使用for i := range s 處理英文字符串的時候,可能不會有問題,因為英文字符(ASCII 字符)在 UTF-8 編碼中是單字節(jié)表示的,所以每個字符正好對應一個字節(jié)。

  • 但是如果字符串中包含非英文字符(如中文、表情符號等),它們通常會占用多個字節(jié)。在這種情況下。使用for i := range s 就會發(fā)現問題,range 會按照字符(rune)進行遍歷,統(tǒng)計的數量是字符數(rune)【如下只有1個】,而不是字節(jié)數(byte)【一個中文,應該是對應3個字節(jié)】。

package main

import "fmt"

func main() {
	s := "你" // 字符串包含中文字符

	// 使用 range 遍歷字符串
	fmt.Println("使用 range 遍歷字符串:")
	for i := range s {
		fmt.Printf("s[%d] = %v (類型: %T)\n", i, s[i], s[i]) // 打印每個字節(jié)的值
	}
}

輸出:

使用 range 遍歷字符串:
s[0] = 228 (類型: uint8)

字符還原

要從 byte 序列或 rune 序列還原回原始字符串,你可以通過以下方式進行操作:

  • 從 byte 序列還原字符串:可以直接使用 string(byteSlice)。
  • 從 rune 序列還原字符串:可以直接使用 string(runeSlice)

從 byte 序列還原字符串

package main

import "fmt"

func main() {
	s := "你好" // 字符串 "你好"

	// 將字符串轉換成 rune 切片
	bytes := []byte(s)

	fmt.Println("bytes:", bytes)
	// 將 rune 切片轉換回字符串
	s1 := string(bytes)
	fmt.Println("還原的字符串:", s1)
}

bytes: [228 189 160 229 165 189]
還原的字符串: 你好

從 rune 序列還原字符串

package main

import "fmt"

func main() {
	s := "你好" // 字符串 "你好"

	// 將字符串轉換成 rune 切片
	runes := []rune(s)

	fmt.Println("runes編碼:", runes)
	// 將 rune 切片轉換回字符串
	s1 := string(runes)
	fmt.Println("還原的字符串:", s1)
}


runes編碼: [20320 22909]
還原的字符串: 你好

到此這篇關于Golang中rune和byte的使用與區(qū)別的文章就介紹到這了,更多相關Golang rune和byte內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go無緩沖通道(同步通道)的實現

    Go無緩沖通道(同步通道)的實現

    本文主要介紹了Go無緩沖通道(同步通道)的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Golang實現檢測SSL證書有效期

    Golang實現檢測SSL證書有效期

    本文主要為大家詳細介紹如何使用Go語言中的crypto/tls模塊來獲取網站的SSL/TLS證書信息并檢查其有效期,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-04-04
  • Golang?json?庫中的RawMessage功能原理

    Golang?json?庫中的RawMessage功能原理

    今天我們來學習一個 Golang 官方 json 庫提供了一個經典能力RawMessage,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 一文帶你了解Go語言中鎖特性和實現

    一文帶你了解Go語言中鎖特性和實現

    Go語言中的sync包主要提供的對并發(fā)操作的支持,標志性的工具有cond(條件變量)?once?(原子性)?還有?鎖,本文會主要向大家介紹Go語言中鎖的特性和實現,感興趣的可以了解下
    2024-03-03
  • Go語言并發(fā)之通知退出機制的實現

    Go語言并發(fā)之通知退出機制的實現

    本文主要介紹了Go語言并發(fā)之通知退出機制的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-07-07
  • golang使用go test輸出單元測試覆蓋率的方式

    golang使用go test輸出單元測試覆蓋率的方式

    單元測試覆蓋率是衡量代碼質量的一個重要指標,重要的代碼文件覆蓋率應該至少達到80%以上,Java 可以通過JaCoCo 統(tǒng)計覆蓋率,那么go 項目如何進行代碼覆蓋率測試呢,本文將給大家詳細的介紹一下golang使用go test輸出單元測試覆蓋率的方式,需要的朋友可以參考下
    2024-02-02
  • Go語言切片常考的面試真題解析

    Go語言切片常考的面試真題解析

    了解最新的Go語言面試題型,讓面試不再是難事,下面這篇文章主要給大家介紹了關于Go語言切片面試??嫉囊恍﹩栴},文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Go語言map實現順序讀取

    Go語言map實現順序讀取

    當我們遍歷 map 時,那就是輸出的鍵值對順序是不確定的,本文主要介紹了Go語言map實現順序讀取, 文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 一文詳解Golang中net/http包的實現原理

    一文詳解Golang中net/http包的實現原理

    這篇文章主要介紹了如何用?net/http?自己編寫實現一個?HTTP?Server?并探究其實現原理,具體講解Go語言是如何接收和處理請求的,希望能夠對大家的學習或工作具有一定的幫助
    2022-08-08
  • 淺析Go語言中的逃逸分析

    淺析Go語言中的逃逸分析

    逃逸分析算是go語言的特色之一,所以這篇文章小編就來和大家聊聊為什么不應該過度關注go語言的逃逸分析,感興趣的小伙伴可以跟隨小編一起了解一下
    2024-10-10

最新評論

衡阳县| 汪清县| 靖安县| 静宁县| 浙江省| 揭东县| 楚雄市| 昌都县| 平江县| 长沙市| 铜山县| 图们市| 徐汇区| 栾城县| 延安市| 玉溪市| 嘉鱼县| 乌兰察布市| 金溪县| 温泉县| 合川市| 广德县| 察隅县| 济阳县| 满城县| 黔西县| 来安县| 博乐市| 扎赉特旗| 东阳市| 新兴县| 台南市| 通江县| 阿克苏市| 梓潼县| 丹阳市| 宁陵县| 乌海市| 海盐县| 云浮市| 罗甸县|