[Go 入门] 第一章 类型
Go 入门系列参考于互联网资料与 人民邮电出版社 《Go 语言入门经典》 与 《Effective Go》,编写目的在于学习交流,如有侵权,请联系删除
Go 是一种静态类型语言, 本文内容:
- 数据类型是什么
- 区分静态与动态类型
- 理解数值类型
- 检查变量的类型
- 类型转换
- 问题列表
数据类型是什么
数据类型让编程语言、编译器、数据库和代码执行环境知道如何操作和处理数据。例如数据类型声明为数字时,计算机就可以进行数学运算,无论数据类型是否被显式地声明,他们都是重要的编程和计算结构。
静态类型与动态类型
所谓强类型语言,指的是错误地使用了类型时,编译器将引发错误;所谓动态类型(松散型或弱类型)语言,是为了执行程序,运行时将会从一种类型转换为另一种类型,或者编译器没有实现类型系统。
静态类型语言的优点:
- 性能高于动态类型语言
- Bug 通常会被编译器发现
- 代码编译器可提供代码补全和其他功能
- 数据完整性更好
动态类型语言的优点:
- 使用动态类型语言编写程序的速度通常更快
- 无需为执行代码而等待编译器完成变异
- 动态类型语言通常不那么死板,因此有些人认为变更代码更加容易
- 有些人认为动态类型语言学习门槛更低
在Go语言中,可以显式地声明类型,也可以让编译器推断类型
理解数值类型
布尔类型
布尔值只能为 true 和 false,虽然有些语言可以用 1 和 0 表示 true 和 false,但是 Go语言不允许
您可能听说过浮点数、整数、无符号整数….这些都是整型(数值)类型,要明白这些的意义,就必须知道数字在计算机内部都是以二进制位的方式储存的,二进制位就是一系列的布尔值,要么取值为1要么为0。1位可以表示1或0,对于4位整数,下表对二进制和十进制进行了比较,由此可知,4位可表示16个不同的数字。
4位的无符号整数
二进制 | 十进制 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | 10 |
1011 | 11 |
带符号整数和无符号整数
对于带符号的整数,需要使用一位来表示符号,这通常是符号 “-“,下表列出了无符号的4位整数,取值范围为0~15。带符号的整数可正可负,因此4位带符号的整数的取值范围为 -8到7
4位的带符号整数
二进制 | 十进制 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | -8 |
1001 | -7 |
1010 | -6 |
1011 | -5 |
1100 | -4 |
1101 | -3 |
1110 | -2 |
1111 | -1 |
可使用的最大数值取决于计算机处理器,计算公式为 $2^{有效位数}-1$ , 也就是64位的值域为 -9223372036854775808 .. 9223372036854775807
类型 int 表示带符号的整数,因此可正可负。根据计算机的底层体系结构,int 可能是32位的带符号整数,也可能是64位的带符号整数,除非要处理的数字非常大或者注重性能,否则只需要使用 int,而无需关心编译器是如何做的
浮点数
浮点数是带小数点的数字,如55.5、0.1111、2.22。整数不能包含小数部分,Go语言中浮点数可以是32位的也可以是64位的,在大多数当代计算机中,推荐使用 float64
字符串
字符串可以是任何字符序列,其中的字符可以是数字、字母、符号,如下:
- test
- $^&^&^
- a128390
在 Go 语言中声明字符串变量如下
1 |
|
字符串变量可以为空,这种变量非常适合用来累积其他变量中的数据以及储存的临时数据
1 |
|
创建后,使用以下的语句来累积字符串”foo”将其添加到末尾处
1 |
|
数组
数组是几乎所有编程语言都受支持的另一种数据类型,这是一种比较复杂的类型,因为其包含一系列的元素。声明数组时,必须制定其长度和类型。1
var beatles[4]string
方括号内的数字表示数组的长度,而紧跟在方括号后的是数组的类型
检查变量的类型
在 Go 语言中,我们可以使用标准库的 reflect 包
1 |
|
类型转换
将数据从一种类型转换到另一种类型是编程常见的任务。Go提供了良好的类型转换支持。strconv 包提供了一整套类型转换方法,可用于转换为字符串或将字符串转换成其他类型
如下,是将字符串转换成布尔类型的例子:1
2var s string = "true"
b, err := strconv.ParseBool(s)
问题列表
数组能储存不同类型的数据吗
能
熟悉 C 等其他语言。在 Go 语言中需要分配内存吗?
Go 负责内存的分配和执行垃圾回收。虽然正常的内存使用规则仍然适用,但无需直接管理内存