本节主要介绍 Go语言的常量与变量声明,以及它们的基本使用要求和作用域。

常量

在计算机内存中,常量(Constants)用于存储值固定不变的数据,并给出名称。

常量的声明格式如下:

const name [type] = value

  • 关键字 const 用于声明常量的定义。
  • name 表示常量名。
  • 方括号表示 type 部分可选,代表常量的类型。当程序员没有指定该部分时,常量的类型将根据最后的 value(值)自动推断得出;当程序员显式指定 type 时,常量将被限定为特定的数据类型。
  • = 为赋值符号,用于将 value 值赋给常量 name。一旦完成赋值,名称为 name 的常量就有了值,且不会改变。

1、单一常量声明

举个例子:
package main
import "fmt"
//单一常量声明及使用
func main() {
    const age=1    //声明值为1的整型常量age
    const num int =10 //声明值为10的整型常量num, int为指定的类型
    fmt.Println("三酷猫!",age,"岁",num,"只") //打印输出常量,通过逗号分隔可以输出多个常量
}
在 GoLand 代码编辑框中单击代码左侧的绿色三角形按钮,执行代码的编译运行,结果如下:

三酷猫! 1 岁 10 只
Process finished with exit code 0

注意,常量的类型只能是基本数据类型,即布尔型、数字型(整型、浮点型和复数型)和字符串型。

2、批量常量声明

举个例子:
const(
        e = 2.7182818 //数学中的自然常数e
        pi = 3.1415926 //数学中的7位小数,圆周率π
    )
    fmt.Println("数学里的常量:",e,pi) //打印输出常量
从上述定义中可以发现,在批量声明常量时,在关键字 const 后面使用圆括号包裹连续声明的多个常量。其运行结果如下:

数学里的常量: 2.7182818 3.1415926

3、常量生成器iota

使用关键字 iota 可以为批量常量进行连续增 1 赋值。iota 初始值为 0。

举个例子:
const(
        spring=iota    //初始值为0,可以通过iota+1方法调整初始值
        summer
        autumn
        winter
    )
    fmt.Println("一年四季:",spring,summer,autumn,winter)
上述代码的运行结果如下:

一年四季: 0 1 2 3

变量

在计算机内存中,变量(Variable)用于存储值可变化的数据,并给出名称。

变量的声明格式如下:

var name [type] = [expression]

关键字 var 用于声明变量定义;name 是变量名;type 用于指定变量的类型;xpression 是表达式。Go 语言的变量基本类型包括数字型(整型、浮点型、复数型)、布尔型、字符串型。

和常量类似,在声明变量时,type 也是可以被省略的。另外,expression 也是可以被省略的。但是这二者不允许同时省略。

1、单一变量声明

在 Go语言中,声明某个变量有 3 种途径。

1) 显式指定变量类型。在使用关键字 var 声明变量时显式指定变量类型:
var age int    //定义整型变量age,其默认初始值为0, int为指定的类型
fmt.Println(age)
运行结果如下:

0


2) 通过值判断类型,例如:
var age0 = 1 //编译器通过值判断类型

3) 连续声明同一类型的变量,例如:
var n1,n2,n3 int //连续声明同一类型的变量

2、批量变量声明

当需要连续声明多个变量时,可以采用批量格式声明,这样可以少写几个 var。例如:
var( num int //数量
    age1 int //年龄
    name string //姓名,字符串型
    )

3、简短格式声明

Go语言还提供了一种简短格式的变量声明方法,格式如下:

名字:=表达式

这里的名字为变量名,中间省略了类型指定,使用“:=”代替,并且后面必须赋值,这里的值可以用表达式计算。该方法仅限在一个函数体内使用,例如:
day:=5
当一个变量被声明后,Go语言会自动赋予它一个初始值:整型为 0、浮点型为 0.0、复数型为(0+0i)、布尔型为 false、字符串型为空字符串 ""、指针为 nil。

作用域

根据使用范围的不同,变量可以分为全局变量和局部变量。

全局变量是指在函数体外定义的变量,不但可以在本代码文件中使用,而且可以在其他代码文件中通过“import 变量名”的形式使用。全局变量只有在程序终止运行时才会在内存中被销毁。

局部变量是指在函数体内声明的变量,它们的作用域只在函数体内,在函数执行完成后,会在内存中被销毁。

举个例子:
package main
import "fmt"
//变量声明
var expA=1 //全局变量
func main() { //主函数
    var expA int = 2 //局部变量
    fmt.Println(expA,expB)
}
var expB=5 //全局变量
运行结果如下:

2 5

为何运行结果是 2 5,而不是 1 5 呢?这是因为用于打印输出的 expA 变量是在 main() 函数体内而非全局变量 expA 内声明的。也就是说,当有相同名称的两个变量分别位于函数体内和全局内时,函数体内的变量享有更高的使用优先权。

当然,由于函数体内声明的变量是局部变量,因此上例中若存在另一个函数,且函数体内没有声明名称为 expA 的变量时,则在该函数中打印 expA 的值为 1。

注意,全局变量声明必须以 var 关键字开头,如果想要在外部包(Package)中使用全局变量,则其首字母必须大写。