一、字符
Go 中,独立的字母、数字和符号被统称为字符。
通过拼接多个字符并使用双引号包裹起来,就得到了字符串字面量,在 Go 中使用 string
表示。
独立的字符需要使用英文的单引号包裹起来,就像下面的代码里一样:
var w = 'a'
代码点
实际上计算机存储字符、符号和表情的时候,存储的是它们对应的一个到多个数字,这些数字称为 代码点。
统一码联盟(Unicode Consortium)定义了每个字符对应的代码点。
例如,大写字母 A 对应的代码点为 65,表情😃 对应的代码点为 128515。
这些可以使用格式化输出中的 %c
和 %v
来验证。
fmt.Printf("%c %[1]v\n", 'A') // A 65
fmt.Printf("%c %[1]v\n", '😃') // 😃 128515
rune 类型
Go 中使用 rune
(符文)类型用于表示单个Unicode 的代码点,该类型是 int32
类型的别名。
var pi rune = 960
var alpha rune = 940
fmt.Printf("%v -> %[1]c \n%v -> %[2]c\n", pi, alpha)
以上代码将会输出
960 -> π
940 -> ά
实际上二进制数据可以使用 byte
类型表示,它是 uint8
类型的别名。byte
也可以表示 美国信息交换标准代码(ASCII)中的英文字符(总供 128个字符,包含了英文标点符号)。
var bang byte = 33
fmt.Printf("%v -> %[1]c\n", bang) // 33 -> !
实际上 Go 提供了相应的字符字面量句法,可以直接使用单引号包裹单个字符,这样 Go 会自动推导出其类型为 rune
pi1 := 'π'
var pi1 = 'π'
var pi1 rune = 'π'
实际输出时,类型会显示 int32
二、字符串
1 声明 string
默认情况下,Go 会把双引号包裹起来的字面值推断为 string
类型。
如下代码的作用是一样的:
s = "Go"
var s = "Go"
var s string = "Go"
2 零值
字符串的零值是 ""
var blank string
3 原始字符串字面量
若果你执行打印出 \n
而不是打印新的一行,需要使用反引号 ``
fmt.Println("hello\nworld")
fmt.Println(`hello\nworld`)
如上代码谁打印出如下内容:
hello
world
hello\nworld
这种反引号的方式,可以让原始字符串字面量实现跨越多个文本行。
fmt.Println(`
hello
world
`)
这会输出
hello
world
使用场景,Windows 系统的文件路径就非常适合使用原始字符串字面量。
path := `C:\go`
fmt.Println(path)
4 获取字符串中的字符
字符串可以使用字符在字符串中的索引来获取到这个字符,但是无法修改字符串。
msg := "hello"
c := msg[3]
fmt.Printf("字符字面值是%c 代码点是%[1]v\n",c) // 字符字面值是l 代码点是108
实现把小写字母转换为大写的程序
c := 'g'
c = c - 'a' + 'A'
fmt.Printf("%v - %v + %v\n", 'g', 'a', 'A') // 103 - 97 + 65
fmt.Printf("%c %[1]v\n", c) // G 71
三、布尔值 bool
布尔值的取值返回只有 true
和 false
t := true
f := false
fmt.Printf("%v %[1]T\n", t) // true bool
fmt.Printf("%v %[1]T\n", f) // false bool