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 字符的国际文本时的重要性。

相关推荐
百里守约学编程13 小时前
70. 爬楼梯
算法·leetcode·go
a_ran1 天前
一些 Go Web 开发笔记
后端·golang·go·编程·web·网站
影灵衣丶2 天前
go进阶编程:设计模式之适配器模式
后端·go
StevenZeng学堂2 天前
【云原生安全篇】Cosign助力Harbor验证镜像实践
网络·安全·云原生·容器·kubernetes·云计算·go
qq_172805593 天前
GO Message Bus
开发语言·后端·golang·go
一丝晨光3 天前
void类型
java·开发语言·javascript·c++·c#·go·c
IT杨秀才3 天前
自己动手写了一个协程池
后端·程序员·go
狼爷4 天前
解开 Golang‘for range’的神秘面纱:易错点剖析与解读
go
StevenZeng学堂4 天前
一文掌握Harbor镜像同步公有云镜像仓库实践
网络·阿里云·云原生·kubernetes·华为云·云计算·go
always20224 天前
Gin框架简易搭建(3)--Grom与数据库
数据库·go·gin