零基础 go - 08(基本数据类型 - 字符型)

2 阅读4分钟

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 编码,这样就不会出现中文乱码的问题。