rune byte in go

There are some the basic data types built in Golang

  • int8 16 32 63
  • uint8 16 32 64
go 复制代码
int32 == rune

byte = uint8

go里面的int和int32是同一个概念吗?

int is a signed integer type that is at least 32 bits in size. It is a distinct type, however, and not an alias for, say, int32.

不是一个概念!千万不能混淆。go语言中的int的大小是和操作系统位数相关的,如果是32位操作系统,int类型的大小就是4字节。如果是64位操作系统,int类型的大小就是8个字节。除此之外uint也与操作系统有关。

int8占1个字节,int16占2个字节,int32占4个字节,int64占8个字节。

What is the difference between rune and byte?

byte

  1. byte = uint8 (data range 0-255). one byte equals 8 bits. (IE 8位0或1高低码) 所以一般byte表示单字节字符
用途
  1. ASCII 字符表示 :由于 byte 类型与 ASCII 码的编码范围相匹配,它可以用来直接表示 ASCII 码表中的任何一个字符。例如,字符 'A' 的 ASCII 码值是 65,可以用 byte 类型表示为 var ch byte = 'A'在 Go 中,用单引号包围的单个字符字面量会被解释为 rune 类型(UTF-8 字符),但由于 runeint32 类型的别名,且 ASCII 字符的编码范围完全落在 uint8 范围内,所以可以直接赋值给 byte 类型变量。

  2. 二进制数据处理byte 类型非常适合处理二进制数据,如文件内容、网络数据包、加密数据等。字节数组([]byte)常用来表示字节序列,可以用来存储或传输任意二进制数据。

  3. 编码与解码 :在进行数据编码(如 Base64、十六进制、URL 编码等)和解码时,通常需要将数据表示为 byte 类型的切片。许多标准库中的编码/解码函数接受或返回 []byte 类型的数据。

  4. 字节级操作 :在需要对数据进行逐字节操作的场合,如位运算、查找特定字节、计算校验和等,byte 类型提供了自然的处理单元。

  5. 与整型类型的互操作性 :尽管 byte 是专门针对字节设计的类型,但它本质上是一个整数类型,因此可以与其他整数类型进行算术运算、比较、类型转换等操作。例如,可以将 byte 值与 intuint 等类型的变量直接相加或相减。

表示与初始化

byte 类型的值可以通过以下几种方式表示和初始化:

  • 直接赋值一个介于 0 到 255 之间的整数值,如 var b byte = 42
  • 使用字符字面量,如 var c byte = 'x'。注意,虽然这里使用了字符字面量,但由于 ASCII 字符编码与 byte 类型范围相符,赋值是合法的。
  • 通过十六进制或八进制字面量表示特定字节值,如 var hexByte byte = 0x4A(十六进制)或 var octalByte byte = '\112'(八进制)。

rune 类型的区别

Go 语言中还有一个与字符相关的类型:rune。它是 int32 类型的别名,专门用来表示 Unicode 码点(UTF-32 编码)。rune 类型能够表示世界上几乎所有的字符,包括那些需要多个字节编码的多字节字符(如汉字、日文假名等 Unicode 字符)。当需要处理包含非 ASCII 字符的文本时,应当使用 rune 类型而不是 byte 类型。

总结来说,Go 语言中的 byte 类型是专门用于表示单个字节的无符号整数类型,适用于处理 ASCII 字符、二进制数据、编码解码等场景 。它与 rune 类型(用于表示 Unicode 字符)有着明确的分工,分别服务于不同的字符编码体系和文本处理需求。在实际编程中,应根据数据的性质和处理要求正确选择使用 byterune 类型。

go 复制代码
func test() {

     // var f byte = 'a'
	var f uint8 = 'a'
	fmt.Println("", f, string(f))
    
    //  int32
    //  var chineseChar []rune = []int{'中', '😃', 'α'}
 	var chineseChar []int = []int{'中', '😃', 'α'}

	fmt.Println(";;;", chineseChar, string(rune(chineseChar[0])), string(rune(chineseChar[1])), string(rune(chineseChar[2])))

}

Rune

ASCII 码只需要 7 bit 就可以完整地表示,但只能表示英文字母在内的128个字符,为了表示世界上大部分的文字系统,发明了 Unicode, 它是ASCII的超集,包含世界上书写系统中存在的所有字符,并为每个代码分配一个标准编号(称为Unicode CodePoint),在 Go 语言中称之为 rune,是 int32 类型的别名。

Go 语言中,字符串的底层表示是 byte (8 bit) 序列,而非 rune (32 bit) 序列。

go 复制代码
sample := "我爱GO"
runeSamp := []rune(sample)
runeSamp[0] = '你'
fmt.Println(string(runeSamp))  // "你爱GO"
fmt.Println(len(runeSamp))  // 4

示例 1:定义和初始化 rune 变量

go 复制代码
var chineseChar rune = '中' 
var emojiRune rune = '😃'
var greekLetterRune rune = 'α' 

fmt.Printf("Chinese character: %c\n", chineseChar) 
fmt.Printf("Emoji: %c\n", emojiRune) 
fmt.Printf("Greek letter: %c\n", greekLetterRune)

示例 2:从字符串中提取 rune (%d

go 复制代码
var mixedString string = "Hello, 世界! 😊"
2
3for _, char := range mixedString {
4    fmt.Printf("Rune value: %d, Character: %c\n", char, char)
5}
6
7// 输出类似:
8// Rune value: 72, Character: H
9// Rune value: 101, Character: e
10// ...
11// Rune value: 12314, Character: 世
12// Rune value: 12377, Character: 界
13// Rune value: 128522, Character: 😊

示例 3:使用 unicode 包进行字符分类

go 复制代码
import (
2    "unicode"
3    "fmt"
4)
5
6func main() {
7    var char rune = 'ô'
8
9    if unicode.IsUpper(char) {
10        fmt.Println("The character is uppercase.")
11    } else if unicode.IsLower(char) {
12        fmt.Println("The character is lowercase.")
13    } else {
14        fmt.Println("The character is neither uppercase nor lowercase.")
15    }
16}
17
18// 输出:The character is lowercase.

示例 4:使用 utf8.DecodeRuneInString 解码多字节字符

go 复制代码
import (
2    "unicode/utf8"
3    "fmt"
4)
5
6func main() {
7    var multiByteStr string = "こんにちは"
8
9    r, size := utf8.DecodeRuneInString(multiByteStr)
10    fmt.Printf("First rune: %c, Size in bytes: %d\n", r, size)
11
12    // 输出:First rune: こ, Size in bytes: 3
13}

这个例子展示了如何使用 utf8.DecodeRuneInString 函数从一个多字节字符串中解码出第一个 rune,同时返回该 rune 所占用的字节数。在这里,我们解码了日语字符串的第一个字符及其字节长度。

以上示例展示了 rune 类型在不同场景下的应用,包括直接定义和初始化、从字符串中提取、使用 unicode 包进行字符分类,以及使用 utf8 包进行多字节字符解码。这些例子体现了 rune 类型在处理包含非 ASCII 字符的国际文本时的重要性。

相关推荐
王中阳Go2 小时前
面试完第一反应是想笑
后端·go
Code季风6 小时前
gRPC与Protobuf集成详解—从服务定义到跨语言通信(含Go和Java示例)
go·grpc·protobuf
Code季风6 小时前
Protobuf 高级特性详解
go·protobuf
_代号0076 小时前
Go 编译报错排查:vendor/golang.org/x/crypto/cryptobyte/asn1 no Go source files
后端·go
岁忧14 小时前
(LeetCode 面试经典 150 题 ) 11. 盛最多水的容器 (贪心+双指针)
java·c++·算法·leetcode·面试·go
Nejosi_念旧14 小时前
解读 Go 中的 constraints包
后端·golang·go
漫步向前21 小时前
gin问题知识点汇总
go
mao毛21 小时前
go Mutex 深入理解
go·源码阅读
钩子波比1 天前
🚀 Asynq 学习文档
redis·消息队列·go
漫步向前1 天前
beegoMVC问题知识点汇总
go