Go语言中的多语言文本
文章目录
声明字符串
字符串的三种定义方式:
str1 := "str1"
var str2 = "str2"
var str3 string = "str3"
字符串的零值
声明字符串但没有给它赋值:
var kong string
字符串的零值是""(双引号之间什么也没有)
字符串字面值/原始字符串字面值
- 字符串字面值可以包含转义字符,例如 \n
- 但如果你确实想得到 \n 而不是换行的话,可以使用 `` (Esc下面的反引号)来代替 “ ” ,这叫做原始字符串字面值
字符串字面值(string literal)
例子1
fmt.Println("家人们,\n谁懂啊")
输出结果:
家人们,
谁懂啊
原始字符串字面值(raw string literal)
例子2
fmt.Println(`家人们,\n谁懂啊`)
输出结果:
家人们,\n谁懂啊
例子2
fmt.Println(`
家人们
谁懂啊`)
输出结果:
家人们
谁懂啊
由以上对比结果可知,``(反引号)是原封不动将引号内的内容输出出来,不使用转义字符转义
小测试
输出一个D:\go\test
字符,code points,runes,bytes
-
Unicode联盟为超过 100 万个字符分配了相应的数值,这个数叫做code point
- 例如:65代表 “A” ,49代表 “1”,128515代表 "笑脸
-
为了表示这样的 Unicode code point,Go语言提供了 rune(符文)这个类型,它是 int32 的一个类型别名
-
而 byte 是 uint8 类型的别名,目的是用于二进制数据
- byte 倒是可以表示由 ASCII 定义的英语字符,它是 Unicode 的一个子集(共128个字符)
类型别名
-
类型别名就是同一个类型的另一个名字
- 所以,rune 和 int32 可以互换使用
-
也可以自定义类型别名,语法如下
type byte = uint8 type rune = int32
打印
-
如果想打印字符而不是数值,使用 %c 格式化动词
-
任何整数类型都可以使用 %c 打印,但是 rune 意味着该数值表示了一个字符
例子
var pi rune = 960
var alpha rune = 940
var omega rune = 969
var bang byte = 33
fmt.Printf("%v %v %v %v\n", pi, alpha, omega, bang)
// 960 940 969 33
fmt.Printf("%c %c %c %c\n", pi, alpha, omega, bang)
// π ά ω !
利用 %v 是直接打印出它的数值,rune 是 int32 ,byte 是 uint8
字符
- 字符字面值使用 ’ ’ (单引号)括起来,例如:’A‘
- 如果没指定字符类型的话,那么Go会推断它的类型为 rune
例子
grade := 'A'
var grade1 = 'A'
var grade2 rune = 'A'
- 这里的 grade 仍然包含一个数值,例子中就是 65,它是 A 的code point
- 字符字面值也可以用 byte 类型:
var star byte = '*'
小测试
-
ASCII 编码里包含了多少个字符?
-
rune 和 byte的类型别名分别是什么?
-
等于号和感叹号的code point分别是多少?(不要去查看表格,利用Go语言)
string
可以给某个变量赋予不同的 string 值,但是 string 本身是不可变的
例子
var message = "hello"
c := message[4] // 字符串可以看做是字符数组,这里取索引下标为4的元素
fmt.Printf("%c", c) // o
message[4] = 'c' // 字符串本身是不可变的,不可修改,会报错
小测试
写个程序,打印出helloworld的每个字符,每个字符独占一行
提示:len()可以获取字符串长度
凯撒加密法
- 对于加密信息,一种简单有效的办法就是把每个字母都移动固定长度的位置
- 例如:a -> d,b -> e
简单实现
c := 'a'
c = c + 3
if c > 'z' {
c = c - 26
}
fmt.Printf("%c", c)
小测试
- 这个语句的作用是什么?c = c - ‘a’ + ‘A’
- 如果 c 是 ‘g’ ,那么 c 执行完第一问的代码结果是什么?
UTF-8
- Go 中的字符串是用 UTF-8 编码的,UTF-8 是 Unicode Code Point 的几种编码之一
- UTF-8 是一种有效率的可变长度的编码,每个 code point 可以是 8 位、16 位或 32 位的
- 通过使用可变长度编码,UTF-8 使得从 ASCII 的转换变得简单明了,因为 ASCII 字符与其 UTF-8 编码的对应字符是相同的
- UTF-8 是万维网的主要字符编码。它是由 Ken Thompson 于1992年发明的,他也是Go语言的设计者之一
range
使用 range 关键字,可以遍历各种集合
例子
str := "你好,Tom"
for i, c := range str {
fmt.Printf("%v %c\n", i, c)
} // i得到的是索引,这个是区分8位,16位,32位的
运行结果:
0 你
3 好
6 ,
7 T
8 o
9 m
由此可见,中文你好是32位的,而英文逗号和英文Tom是8位的
本次关于Go语言中的多语言文本的学习笔记,就分享结束了,都是比较基础的内容,希望可以帮助到大家,小测试的答案发布在评论区,答案不唯一,只是做为参考