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
- byte = uint8 (data range 0-255). one byte equals 8 bits. (IE 8位0或1高低码) 所以一般byte表示单字节字符
用途
-
ASCII 字符表示 :由于
byte
类型与 ASCII 码的编码范围相匹配,它可以用来直接表示 ASCII 码表中的任何一个字符。例如,字符'A'
的 ASCII 码值是 65,可以用byte
类型表示为var ch byte = 'A'
。在 Go 中,用单引号包围的单个字符字面量会被解释为rune
类型(UTF-8 字符),但由于rune
是int32
类型的别名,且 ASCII 字符的编码范围完全落在uint8
范围内,所以可以直接赋值给byte
类型变量。 -
二进制数据处理 :
byte
类型非常适合处理二进制数据,如文件内容、网络数据包、加密数据等。字节数组([]byte
)常用来表示字节序列,可以用来存储或传输任意二进制数据。 -
编码与解码 :在进行数据编码(如 Base64、十六进制、URL 编码等)和解码时,通常需要将数据表示为
byte
类型的切片。许多标准库中的编码/解码函数接受或返回[]byte
类型的数据。 -
字节级操作 :在需要对数据进行逐字节操作的场合,如位运算、查找特定字节、计算校验和等,
byte
类型提供了自然的处理单元。 -
与整型类型的互操作性 :尽管
byte
是专门针对字节设计的类型,但它本质上是一个整数类型,因此可以与其他整数类型进行算术运算、比较、类型转换等操作。例如,可以将byte
值与int
、uint
等类型的变量直接相加或相减。
表示与初始化
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 字符)有着明确的分工,分别服务于不同的字符编码体系和文本处理需求。在实际编程中,应根据数据的性质和处理要求正确选择使用 byte
或 rune
类型。
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 字符的国际文本时的重要性。