Golang 学习 【rune 类型】

什么是 rune?

在 Go 语言中,rune 是一种内置类型,等价于 int32。它用于表示 Unicode 标量值(即单个字符)。
每个 rune 表示一个 Unicode 码点。
在处理非 ASCII 字符(如中文、日文等)时,rune 非常有用。

rune 和 byte 的区别

特性byterune
类型uint8int32
用途表示单字节数据(ASCII 字符)表示 Unicode 码点(多字节字符)
示例‘A’ (65)‘中’ (20013)

如何使用 rune?

示例 1:遍历字符串中的每个字符

package main

import "fmt"

func main() {
    str := "Go语言"
    for i, r := range str {
        fmt.Printf("Index: %d, Rune: %c, Unicode: %U\n", i, r, r)
    }
}

// 输出
// Index: 0, Rune: G, Unicode: U+0047
// Index: 1, Rune: o, Unicode: U+006F
// Index: 2, Rune: 语, Unicode: U+8BED
// Index: 4, Rune: 言, Unicode: U+8A00

示例 2:将字符串转换为 rune 切片

package main

import "fmt"

func main() {
    str := "Go语言"
    runes := []rune(str)
    fmt.Println(runes) // [71 111 20013 21494]
}

为什么需要 rune?

  • 多字节字符支持:在处理 UTF-8 编码的字符串时,byte 只能表示单字节字符,而 rune 可以正确处理多字节字符。
  • 国际化需求:对于需要支持多种语言的应用程序,rune 是必不可少的工具。

使用场景示例

1.处理多字节字符(如中文、日文等)

在处理非 ASCII 字符时,byte 类型只能表示单字节数据,而 rune 可以正确处理多字节字符(如 Unicode 编码的汉字、表情符号等)。

package main

import "fmt"

func main() {
    str := "Go语言😊"
    for i, r := range str {
        fmt.Printf("Index: %d, Rune: %c, Unicode: %U\n", i, r, r)
    }
}

// 输出
// Index: 0, Rune: G, Unicode: U+0047
// Index: 1, Rune: o, Unicode: U+006F
// Index: 2, Rune: 语, Unicode: U+8BED
// Index: 4, Rune: 言, Unicode: U+8A00
// Index: 6, Rune: 😊, Unicode: U+1F60A

说明:
每个汉字或表情符号都被正确解析为一个 rune。
索引值反映了 UTF-8 编码的多字节特性。

2.判断字符串是否包含特定字符

在需要检查字符串中是否包含某些字符(如汉字、数字、字母等)时,可以将字符串转换为 rune 切片进行逐一判断。

package main

import "fmt"

func containsChinese(str string) bool {
    for _, r := range str {
        if r >= 0x4E00 && r <= 0x9FFF { // 检查是否为汉字
            return true
        }
    }
    return false
}

func main() {
    goodsName := "测试商品"
    if containsChinese(goodsName) {
        fmt.Println("货物名称包含中文")
    } else {
        fmt.Println("货物名称不包含中文")
    }
}

说明:
使用 rune 遍历字符串中的每个字符。
根据 Unicode 范围判断是否为汉字。

3.统计字符串中不同类型的字符数量

在需要统计字符串中字母、数字、空格或其他字符的数量时,可以使用 rune 来区分不同的字符类型。

package main

import (
    "fmt"
    "unicode"
)

func countCharacters(str string) (letters, digits, spaces int) {
    for _, r := range str {
        if unicode.IsLetter(r) {
            letters++
        } else if unicode.IsDigit(r) {
            digits++
        } else if unicode.IsSpace(r) {
            spaces++
        }
    }
    return
}

func main() {
    str := "Go语言 2023 😊"
    letters, digits, spaces := countCharacters(str)
    fmt.Printf("字母: %d, 数字: %d, 空格: %d\n", letters, digits, spaces)
}


// 输出
// 字母: 5, 数字: 4, 空格: 1

说明:
使用 unicode 包提供的方法判断字符类型。
rune 是 unicode.IsXXX 方法的必要输入类型。

4.字符串反转

在需要对字符串进行反转操作时,rune 可以确保多字节字符被正确处理。

package main

import "fmt"

func reverseString(s string) string {
    runes := []rune(s)
    for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}

func main() {
    str := "Go语言😊"
    reversed := reverseString(str)
    fmt.Println("原字符串:", str)
    fmt.Println("反转后:", reversed)
}

// 输出
// 原字符串: Go语言😊
// 反转后: 😊言语oG

5.替换字符串中的特定字符

在需要替换字符串中的某些字符时,可以使用 rune 进行逐字符处理

package main

import "fmt"

func replaceCharacter(s string, old, new rune) string {
    runes := []rune(s)
    for i, r := range runes {
        if r == old {
            runes[i] = new
        }
    }
    return string(runes)
}

func main() {
    str := "Go语言2023"
    replaced := replaceCharacter(str, '2', 'X')
    fmt.Println("原字符串:", str)
    fmt.Println("替换后:", replaced)
}


// 输出
// 原字符串: Go语言2023
// 替换后: Go语言X0X3

发表评论