[Go 入门] 第一章 类型

Go 入门系列参考于互联网资料与 人民邮电出版社 《Go 语言入门经典》 与 《Effective Go》,编写目的在于学习交流,如有侵权,请联系删除

Go 是一种静态类型语言, 本文内容:

静态类型与动态类型

所谓强类型语言,指的是错误地使用了类型时,编译器将引发错误;所谓动态类型(松散型或弱类型)语言,是为了执行程序,运行时将会从一种类型转换为另一种类型,或者编译器没有实现类型系统。
静态类型语言的优点:

  • 性能高于动态类型语言
  • Bug 通常会被编译器发现
  • 代码编译器可提供代码补全和其他功能
  • 数据完整性更好

动态类型语言的优点:

  • 使用动态类型语言编写程序的速度通常更快
  • 无需为执行代码而等待编译器完成变异
  • 动态类型语言通常不那么死板,因此有些人认为变更代码更加容易
  • 有些人认为动态类型语言学习门槛更低

在Go语言中,可以显式地声明类型,也可以让编译器推断类型

理解数值类型

布尔类型

布尔值只能为 truefalse,虽然有些语言可以用 10 表示 truefalse,但是 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
var s string = "foo"

字符串变量可以为空,这种变量非常适合用来累积其他变量中的数据以及储存的临时数据

1
var s string = ""

创建后,使用以下的语句来累积字符串”foo”将其添加到末尾处

1
2
var s string = ""
s += "foo"

数组

数组是几乎所有编程语言都受支持的另一种数据类型,这是一种比较复杂的类型,因为其包含一系列的元素。声明数组时,必须制定其长度和类型。

1
var beatles[4]string

方括号内的数字表示数组的长度,而紧跟在方括号后的是数组的类型

检查变量的类型

在 Go 语言中,我们可以使用标准库的 reflect

1
2
3
4
5
6
7
8
9
10
11
package main

import (
"fmt"
"reflect"
)

func main() {
var s string = "test"
fmt.Println(reflect.TypeOf(s))
}

类型转换

将数据从一种类型转换到另一种类型是编程常见的任务。Go提供了良好的类型转换支持。strconv 包提供了一整套类型转换方法,可用于转换为字符串或将字符串转换成其他类型

如下,是将字符串转换成布尔类型的例子:

1
2
var s string = "true"
b, err := strconv.ParseBool(s)

问题列表

  • 数组能储存不同类型的数据吗

  • 熟悉 C 等其他语言。在 Go 语言中需要分配内存吗?

    Go 负责内存的分配和执行垃圾回收。虽然正常的内存使用规则仍然适用,但无需直接管理内存


All articles in this blog adopt the CC BY-SA 4.0 agreement unless otherwise stated. Please indicate the source for reprinting!