go中没有专门的字符类型,如果要存储字符,一般使用 byte 或 rune 类型。byte 是 uint8 的别名,占用 1 个字节,适合表示 ASCII 字符;rune 是 int32 的别名,占用 4 个字节,适合表示 Unicode 字符。
字符串就是一串固定长度的字符连接起来的字符序列。传统的字符串由字符组成,但go的字符串由字节组成 字符串被认为是字符的数组,但在 Go 语言中,字符串是一个不可变的字节序列。Go 语言中的字符串使用 UTF-8 编码,可以包含任意 Unicode 字符,因此字符串的长度和占用的字节数可能不同。
一、字符变量定义
- 定义字符变量时,可以使用 byte 或 rune 类型来表示单个字符。
- 直接使用 fmt.Println() 输出字符变量时,会输出对应的 Unicode 码值;使用 fmt.Printf() 配合 %c 格式化动词可以输出字符本身。
- 使用 fmt.Printf() 配合 %T 格式化动词可以获取变量的类型;
- 使用 unsafe.Sizeof() 函数可以获取变量占用的字节数。
package main
import (
"fmt"
"unsafe"
)
func main() {
var c1 byte = 'a' // 使用 byte 类型表示 ASCII 字符
var c2 rune = '你' // 使用 rune 类型表示 Unicode 字符
fmt.Println("c1 =", c1) // 输出 c1 = 97,因为 'a' 的 ASCII 码值是 97
fmt.Println("c2 =", c2) // 输出 c2 = 20320,因为 '你' 的 Unicode 码值是 20320
fmt.Printf("c1 的值为%c\n", c1) // 输出 c1 的值为 a
fmt.Printf("c2 的值为%c\n", c2) // 输出 c2 的值为 你
fmt.Printf("c1 的类型是 %T\n", c1) // 输出 c1 的类型是 uint8
fmt.Printf("c2 的类型是 %T\n", c2) // 输出 c2 的类型是 int32
fmt.Printf("c1 占用的字节数是 %d\n", unsafe.Sizeof(c1)) // 输出 c1 占用的字节数是 1
fmt.Printf("c2 占用的字节数是 %d\n", unsafe.Sizeof(c2)) // 输出 c2 占用的字节数是 4
}
- 如果保存的字符对应的码值在 ASCII 范围内(0-127),可以使用 byte 类型;如果需要表示更广泛的 Unicode 字符,建议使用 rune 类型或者 int等。
二、字符的使用细节
- 字符变量使用单引号 '' 包裹,字符串使用双引号 "" 包裹。
- Go 语言中的字符串是不可变的字节序列,使用 UTF-8 编码,可以包含任意 Unicode 字符,因此字符串的长度和占用的字节数可能不同。计算字符串长度需要引入 utf8 包,使用 utf8.RuneCountInString() 函数来获取字符串中的 Unicode 字符数量;使用 len() 函数获取字符串的字节数。
- Go 语言中的字符类型没有专门的 char 类型,通常使用 byte 或 rune 来表示字符。byte 是 uint8 的别名,占用 1 个字节,适合表示 ASCII 字符;rune 是 int32 的别名,占用 4 个字节,适合表示 Unicode 字符。
- go中允许使用转移字符来表示一些特殊字符,例如 \n 表示换行,\t 表示制表符,\ 表示反斜杠本身,' 表示单引号本身," 表示双引号本身等。
- go中的字符本质上是一个整数值,表示对应字符的 Unicode 码点,可以进行算术运算,例如 'a' + 1 的结果是 'b','你' + 1 的结果是 '您'。可以 fmt.Prints() 时使用 %c 格式化动词来输出字符本身,使用 %d 格式化动词来输出字符的 Unicode 码值。
package main
import (
"fmt"
)
func main() {
// 1、定义字符变量
var c1 byte = 'a'
var c2 rune = '你'
fmt.Printf("c1 的值为%c,Unicode 码值为%d\n", c1, c1) // 输出 c1 的值为 a,Unicode 码值为 97
fmt.Printf("c2 的值为%c,Unicode 码值为%d\n", c2, c2) // 输出 c2 的值为 你,Unicode 码值为 20320
// 2、字符本质是一个整数值
var c3 int = 97
fmt.Printf("c3 的值为%c,Unicode 码值为%d\n", c3, c3) // 输出 c3 的值为 a,Unicode 码值为 97
// 3、字符可进行算术运算
fmt.Printf("c1 + 1 的值为%c\n", c1 + 1) // 输出 c1 + 1 的值为 b
fmt.Printf("c2 + 1 的值为%c\n", c2 + 1) // 输出 c2 + 1 的值为 您
}
三、字符本质
- 字符存储到计算机:字符-》Unicode 码点-》UTF-8 编码-》字节序列-》存储到计算机
- 计算机读取字符:字节序列-》UTF-8 解码-》Unicode 码点-》字符
- 字符和码值的对应关系是确定的
- go 中的编码都统一为 UTF-8 编码,这样就不会出现中文乱码的问题。