01介绍

在程序设计中,编译器必须将代表数据的变量名称替换成该数据所在的内存地址。变量的名称、类型及内存地址通常会维持固定,但该内存地址所存储的数据在程序执行期间则可能会改变。

Golang 语言编译器需要先明确变量的内存边界,才可以使用变量。通过声明变量使用的类型,编译器可以明确变量的内存边界。

因为 Golang 语言是静态语言,它不能像动态语言那样,在运行时可以通过分析变量的值,自动确定变量的内存边界,所以在 Golang 语言中,使用变量之前,需要先声明变量。

在 Golang 语言中,在变量显式赋值的前提下,声明变量可以省略类型,和使用短变量声明方法时,也不需要指定变量类型,此时,编译器会根据变量的值通过类型推断得出变量类型,从而明确变量的内存边界。

02变量声明方式

Golang 语言的变量声明比较灵活,它支持多种变量声明的方式,包括标准声明变量,不显式赋初始值声明变量,省略类型声明变量和短变量声明。

标准声明变量

阅读上面这段代码,我们可以发现 Golang 语言的标准声明变量方式包含 4 部分,分别是 var 关键字,变量名 a,变量类型 int 和变量的值 100。

不显式赋初始值声明变量

如果我们不想给声明的变量赋初始值,也可以不显式给变量赋值,省略等号和值,如下所示:

如果不显式给变量赋值,变量的值是类型的零值,即类型的默认值。

省略类型声明变量

标准声明变量方式的 4 部分,除了可以不显式给变量赋值,还可以省略类型,如下所示:

我们在文章开头介绍编译器需要根据变量的类型确定变量的内存边界,如果在声明变量时,未指定变量的类型,编译器还可以确定变量的内存边界吗?

答案是可以。原因是 Golang 编译器可以根据变量的赋值通过类型推断得到变量的类型。

细心的读者可能会问,Golang 语言可以将标准变量声明方式的 4 部分中类型和显式赋初始值同时省略吗?

答案是不可以。Golang 编译器必须至少明确变量的类型或初始值,二者如果都省略,编译器将无法得到变量的类型,从而也就不能根据类型明确变量的内存边界。

短变量声明

以上两种在标准声明变量方式的基础上简化的变量声明方式,都需要使用关键字 var,可能会有读者问可以省略关键字 var 吗?

答案是可以。Golang 语言还有一种最简化的声明变量的方式,短变量声明,使用短变量声明的方式,可以同时省略关键字 var 和变量的类型。

阅读上面这段代码,它就是短变量声明,与标准变量声明的方式相比,该方式省略了关键字 var 和变量的类型。但是,细心的读者可能已经发现,= 改为 :=。Golang 编译器可以根据变量的赋值做类型推断,得到变量的类型,从而明确变量的内存边界。

短变量声明的方式虽然是 Golang 语言中最简化的变量声明的方式,但是它也有局限性,它只能用于局部变量声明。

显式类型转换

无论是省略类型显式赋初始值声明变量,还是短变量声明,它们都是 Golang 编译器根据变量的赋值,通过类型推断得出变量的默认类型。

如果我们也不想使用变量的默认类型,那么我们可以通过显式类型转换得到我们想要的变量类型,如下所示:

变量列表声明

所有声明变量的方式,都支持变量列表声明。所谓变量列表声明,就是使用 var 关键字,通过一行代码声明多个变量。

变量声明块

Golang 语言还支持变量声明块,使用关键字 var 将多个单个变量声明或变量列表声明放在一起,如下所示:

03使用场景

我们介绍了多种变量声明的方式,那么每种 Golang 语言变量声明方式的使用场景分别是什么,首先,我们需要先了解 Golang 语言中变量的作用域,分别是包级变量,全局变量和局部变量。

包级变量

包级变量的作用域是只能在同一个 package 中使用。

包级变量,只能使用 var 关键字的变量声明方式,如果变量声明显式初始化,一般会使用省略类型声明变量的方式。

全局变量

全局变量的作用域是在项目的任意位置都可以使用。

如果包级变量的变量名首字母大写,也就是 Golang 语言中的导出变量,那么这个变量就成为全局变量,可以在全局使用。

全局变量,也只能使用 var 关键字的变量声明方式,如果变量声明显式初始化,一般会使用省略类型声明变量的方式。

局部变量

局部变量的作用域是只能在函数体或方法体中使用。

局部变量,一般会优先使用短变量声明的方式,除非不想给局部变量显式初始化,我们可以使用省略类型声明变量的方式。

04总结

本文我们介绍 Golang 语言为什么在使用变量之前,需要先声明变量;Golang 语言有哪些变量声明的方式和 Golang 语言的每种变量声明方式适用于什么场景。