变量来源于数学。在高中数学里,变量被定义为“没有固定的值,可以改变的数”。但是,变量在计算机语言中被定义为“能够存储数据(计算结果或值)的内存”。明确变量在计算机语言中的含义后,下面讲解变量在Go语言中的使用方法。
声明指的是为程序的一个或多个实体命名。其中,实体指的是变量、常量、类型或函数。本节讲解在Go语言中如何声明变量。
有关如何声明常量、类型和函数,将在本书后面的章节中讲解。
在Go语言中,使用var关键字声明变量,其语法格式如下。
var name type
参数说明如下。
name:变量名。
type:变量的类型。
变量的类型,即变量的数据类型。在Go语言中,数据类型分为四大类,分别是基础类型、复合类型、引用类型和接口类型。本节先介绍基础类型。
在Go语言中有以下几种基础类型。
布尔(bool)类型。
字符串(string)类型。
整数类型。
在Go语言中,整数类型包含4个有符号的整数类型和4个无符号的整数类型。其中,二进制数的位数与整数类型的对应关系如表3.1所示。
表3.1 二进制数的位数与整数类型的对应关系
int类型是当前广泛使用的整数类型。
字符类型。Go语言中有两种字符类型,即byte类型和rune类型。其中,byte类型同义于uint8类型,表示的是ASCII码的一个字符;rune类型同义于int32类型,表示的是Unicode码的一个字符。
浮点数类型。Go语言中有两种浮点数类型,即float32类型和float64类型。
复数类型。复数由两个浮点数表示,其中,一个表示实部,另一个表示虚部。在Go语言中有两种复数类型,即complex64和complex128。
了解Go语言的基础类型后,下面讲解声明变量时的两种特殊情况。
当声明多个相同类型的变量时,须同时使用var关键字和英文格式下的逗号。代码如下。
var a, b, c int
当声明多个不同类型的变量时,须同时使用var关键字和括号(类似情况全书均用英文格式下的括号)。代码如下。
初始化是为变量设置初始值,其语法格式如下。
var name type = expression
参数说明如下。
expression:表达式。
例如,使用Go语言声明一个表示天数的变量,并为这个变量设置初始值,用以表示2022年有365天。代码如下。
var days int = 365
当为变量设置初始值时,类型和表达式可以省略一个。
如果省略类型,那么变量的类型由表达式决定。
例如,省略“var days int = 365”中的int类型后的代码如下。
var days = 365
因为365是整数,所以变量days的类型是整数。
如果省略表达式,那么变量的初始值会被设置为变量类型的默认值。
例如,省略“var days int = 365”中的365后的代码如下。
var days int
days变量的类型是int,其初始值被设置为int类型的默认值,即0。
通过上述示例可知“int类型的默认值是0”。下面是Go语言其他基础类型的默认值。
浮点数类型的默认值是0.0。
字符串类型的默认值是空字符串(即"")。
布尔类型的默认值是false。
在Go语言中可以使用“短变量声明”的语法格式声明并初始化函数内部的局部变量。“短变量声明”的语法格式如下。
name := expression
参数说明如下。
name:变量名。
expression:表达式。
“短变量声明”的语法格式只能使用在函数内部。
例如,使用func关键字声明一个表示驾驶汽车的drive()函数;在drive()函数中,使用“短变量声明”的语法格式表示“当前车辆每百公里消耗汽油6.3L”。代码如下。
注意,在使用“短变量声明”语法格式时,不能提前声明其中的变量。否则,编译器会报错,报错的内容是“变量已经被声明”。错误代码如下。
掌握上述内容后,下面编写一个程序交换两个变量的值。
【例3.1】 交换两个变量的值 (实例位置:资源包 \TM\sl\3\1 )
首先分别声明3个int类型的变量a、b和c,然后分别初始化变量a和变量b的值为7和11,接着把变量c作为中间变量,最后借助变量c交换变量a和变量b的值。代码如下。
运行结果如下。
a = 7 b = 11 a = 11 b = 7
在Go语言中,可以使用“多重赋值”的特性交换两个变量的值。下面使用“多重赋值”的特性修改例3.1。关键代码如下。
①打印即输出,编程人员习惯叫法。
当使用“多重赋值”时,要特别注意上述代码第5行中各个变量的赋值顺序。
在Go语言中,把没有名称的变量称作匿名变量,并且使用空白标识符(即“_”)表示匿名变量。注意,不可以使用匿名变量(即“_”)对其他变量执行赋值或运算的操作;任何被赋给匿名变量的值都会被抛弃。
下面编写一个程序,演示匿名变量的使用方法。
【例3.2】 分别打印一年有多少个月份和节气 (实例位置:资源包 \TM\sl\3\2 )
首先使用func关键字声明用于返回一年中的月份和节气数量的getYearDatas()函数,然后在main()函数中使用匿名变量和“短变量声明”的语法格式分别获取一年中的月份和节气。代码如下。
运行结果如下。
一年有 12 个月份和 24 个节气
下面说明例3.2中的第12行代码“fmt.Println(_)”。当去除代码“fmt.Println(_)”前面的注释符号(即“//”)时,VS Code会报错。提示的错误内容是“cannot use _ as value or type compiler(InvalidBlank)”,其含义是“不能把匿名变量作为变量的值或类型”。这恰恰印证了上文中讲到的,在使用匿名变量的过程中需要注意的事项。
变量的作用域是变量在程序中的作用范围。在Go语言中,把声明在函数内的变量称作局部变量;把声明在函数外的变量称作全局变量;把在声明函数时声明的变量称作形式参数(简称为“形参”)。下面分别讲解局部变量、全局变量和形参。
局部变量的作用域只在函数内。当开始调用局部变量所在的函数时,将声明并初始化这个局部变量;当结束调用局部变量所在的函数时,将销毁这个局部变量。例3.1中的变量a、b和c就是局部变量。
全局变量的作用域是除声明包和导入包外的整个源文件(即.go文件)。在声明全局变量时,使用var关键字。
【例3.3】 计算上班的通勤时间 (实例位置:资源包 \TM\sl\3\3 )
首先使用var关键字声明用于表示“上班通勤时间”的全局变量totalTime,然后分别在main()函数中声明并初始化用于表示“上班步行时间”的变量walkTime和表示“上班乘坐地铁的时间”的变量subwayTime,最后计算并打印上班通勤时间。代码如下。
运行结果如下。
上班通勤时间一共需要 37 分钟
形参是声明函数时在函数名后的括号中声明的变量。当开始调用形参所在的函数时,将声明并初始化形参;当结束调用形参所在的函数时,将销毁形参。
【例3.4】 使用形参修改例3.3 (实例位置:资源包 \TM\sl\3\4 )
首先使用var关键字声明用于表示“上班通勤时间”的全局变量totalTime。然后使用func关键字声明用于返回上班通勤时间的getTotalTime()函数;在这个函数中,包含两个int类型的形参,它们分别是表示“上班步行时间”的time_w和表示“上班乘坐地铁的时间”的time_s。接着分别在main()函数中声明并初始化用于表示“上班步行时间”的变量walkTime和“上班乘坐地铁的时间”的变量subwayTime。最后调用getTotalTime()函数计算并打印上班通勤时间。代码如下。