Go 语言入门指南:基础语法和常用特性解析3 | 青训营

93 阅读4分钟

此篇文章是我参与 #青训营笔记创作活动 的第11篇笔记

主要是简单记录一下自己在学习Go语言基础语法中的变量类型部分时遇到的一些小要点,

只是个人的一个学习记录,水平不高还望大佬们包容。

0x01 字符类型

字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。

Go语言的字符有以下两种:

  • 一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
  • 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。
  • byte 类型是 uint8 的别名,对于只占用 1 个字节的传统 ASCII 编码的字符来说,完全没有问题,例如 var ch byte = 'A',字符使用单引号括起来。

  • 在 ASCII 码表中,A 的值是 65,使用 16 进制表示则为 41,所以下面的写法是等效的:

    • var ch byte = 65
    • var ch byte = '\x41'
    • (\x 总是紧跟着长度为 2 的 16 进制数)
  • 另外一种可能的写法是``后面紧跟着长度为 3 的八进制数,例如 \377。

  • Go语言同样支持 Unicode(UTF-8)

    • 字符同样称为 Unicode 代码点或者 runes
    • 在内存中使用 int 来表示
  • 在文档中,一般使用格式 U+hhhh 来表示,其中 h 表示一个 16 进制数。

  • 在书写 Unicode 字符时,需要在 16 进制数之前加上前缀\u或者\U

    • 如果需要使用到 4 字节,则使用\u前缀
    • 如果需要使用到 8 个字节,则使用\U前缀。
  • 因为 Unicode 至少占用 2 个字节,所以我们使用 int16 或者 int 类型来表示

Unicode 包中内置了一些用于测试字符的函数,这些函数的返回值都是一个布尔值,如下所示(其中 ch 代表字符):

  • unicode.IsLetter(ch)

    • 判断是否为字母
  • unicode.IsDigit(ch)

    • 判断是否为数字
  • unicode.IsSpace(ch)

    • 判断是否为空白符号

附录:

简单来说:

Unicode 是「字符集」
UTF-8 是「编码规则」

其中:

字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)

广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……

Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。 UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节

0x02 字符串类型

字符串的定义以及一些重要的转义字符与其他的高级语言一样,在此随便列一点:

  • \n:换行符
  • \r:回车符
  • \t:tab 键
  • \u 或 \U:Unicode 字符
  • \:反斜杠自身

字符串拼接符“+”

  • 两个字符串 s1 和 s2 可以通过s := s1 + s2拼接在一起。将 s2 追加到 s1 尾部并生成一个新的字符串 s

可以通过下面的方式来对代码中多行的字符串进行拼接:

str := "Beginning of the string " +"second part of the string"
  • 因为编译器会在行尾自动补全分号,所以拼接字符串用的加号“+”必须放在第一行末尾

也可以使用“+=”来对字符串进行拼接:

s := "hell" + "o,"s += "world!"fmt.Println(s) //输出 “hello, world!”

0x03 数据类型转换

在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。

但是,与一些高级语言不同,Go语言不存在隐式类型转换,因此所有的类型转换都必须显式的声明

valueOfTypeB = typeB(valueOfTypeA)
//类型 B 的值 = 类型 B(类型 A 的值)
  • 与其他高级语言类似,go语言的类型转换也只能在定义正确的情况下转换成功

    • 最好保证是从一个取值范围较小的类型转换到一个取值范围较大的类型

      • 将 int16 转换为 int32
    • 当从一个取值范围较大的类型转换到取值范围较小的类型时,会造成精度丢失

      • 将 float32 转换为 int
  • 只有相同底层类型的变量之间可以进行相互转换

    • 将 int16 类型转换成 int32 类型
  • 不同底层类型的变量相互转换时会引发编译错误

    • 将 bool 类型转换为 int 类型(错误)

附录

本文参考链接及推荐阅读:

Go 语言基础语法 | 菜鸟教程 (runoob.com)

Go语言基本语法 (biancheng.net)