Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
概念
在Go语言中,rune 是一个内置的数据类型,用于表示一个Unicode字符。它实际上是一个别名,代表 int32 类型。使用 rune 可以方便地处理字符和字符串中的Unicode字符,尤其是在处理多字节字符集时。
与其他语言不同,Go语言中的字符串并不是由“字符”组成的,而是由Unicode编码的文本组成的,即rune数据类型。
代码
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
//定义字符串s,是一段泰文
const s = "สวัสดี"
//打印的长度是unicode字节的长度,而不是字面意义上字符串的长度
fmt.Println("Len:", len(s))
//fmt.Printf("%x ", s[i]) 打印每个字节的十六进制表示
for i := 0; i < len(s); i++ {
fmt.Printf("%x ", s[i])
}
fmt.Println()
//utf8.RuneCountInString(s) 计算字符串中包含的rune数量
fmt.Println("Rune count:", utf8.RuneCountInString(s))
//遍历字符串,fmt.Printf("%#U starts at %d\n", runeValue, idx) 打印每个rune的Unicode表示和起始位置。
for idx, runeValue := range s {
fmt.Printf("%#U starts at %d\n", runeValue, idx)
}
fmt.Println("\nUsing DecodeRuneInString")
for i, w := 0, 0; i < len(s); i += w {
//utf8.DecodeRuneInString(s[i:]) 函数解码字符串中的rune,并打印每个rune的Unicode表示和起始位置
runeValue, width := utf8.DecodeRuneInString(s[i:])
fmt.Printf("%#U starts at %d\n", runeValue, i)
w = width
//在 examineRune 函数中,根据rune的值进行条件判断,如果rune的值为特定字符,会输出相应的信息。
examineRune(runeValue) //说实话这段输出没太看明白,意思是如果是能用rune即unicode表示的就输出起始位置,找不到的话就输出found so sua
}
}
func examineRune(r rune) {
if r == 't' {
fmt.Println("found tee")
} else if r == 'ส' {
fmt.Println("found so sua")
}
}
理解
package main
import "fmt"
func main() {
//定义一个rune,赋值为A
var a rune = 'A'
fmt.Println(a) //打印出A的unicode编码65
var b rune = '我'
fmt.Println(b) //打印出unicode编码
//字符串转为rune
str := "hello, 你好"
fmt.Println("字符串长度(字节):", len(str))
//用[]rune(str)把字符串转化为rune
fmt.Println("字符数(rune):", len([]rune(str)))
//遍历str并输出索引和值
for i, r := range str {
fmt.Printf("Index: %d, Rune: %c\n", i, r)
}
}
Tips小知识点
- 使用 rune 类型可以有效地处理Unicode字符,确保在处理多语言文本时不会出现字符截断或错误的问题。
- rune 可以表示所有Unicode字符,包括汉字、表情符号等,而不仅仅是ASCII字符。(UTF-8也是)
无人扶我青云志,我自踏雪至山巅,与君共勉。