一架梯子,一头程序猿,仰望星空!
Golang程序设计教程(2024版) > 内容正文

学习Golang变量和常量


1. 变量和常量

在Golang中,变量和常量是两个基本的概念,它们在程序中起着非常重要的作用。

  • 变量是程序中用于存储数据的一个名字标识。在Golang中,可以使用var关键字来声明变量。
  • 常量是程序中其值不会发生改变的标识符。在Golang中,可以使用const关键字来声明常量。

2 Golang变量的声明与初始化

2.1 单个变量的声明与赋值

在Go语言中,使用var关键字来声明变量,格式为 var 变量名 类型。声明后,可在之后的代码中对变量赋值,或者在声明时直接初始化。例如:

var age int // 声明一个整型变量age
age = 25    // 给变量赋值

var name string = "Alice" // 声明并初始化变量name

2.2 批量声明变量

Go语言支持一次性声明多个变量,这可以使代码更加简洁。批量声明通常在函数的开始或包一级作用域进行。举例:

var (
    firstName, lastName string
    age                 int
)

firstName = "John"
lastName = "Doe"
age = 30

在上述的批量声明中,firstNamelastName被声明为字符串类型,而age是整型。

2.3 类型推断和短变量声明

在Go语言中,不一定需要显式指明变量的类型。如果在声明变量时提供了初始化表达式,则Go可以推断出变量的类型。这就是所谓的类型推断。短变量声明使用:=可以在类型推断的基础上,简化声明并初始化变量的语句。示例如下:

city := "Beijing" // 使用短变量声明,同时声明并初始化city
country := "China" // country被推断为字符串类型

值得注意的是,短变量声明只能在函数内部使用,并不能在全局范围内使用。

2.4 函数外的变量声明

在函数外声明的变量是具有包一级作用域的。这些变量在整个包内部都是可见且可用的。例如:

var globalVar string = "I am global" // 全局变量声明

func printGlobalVar() {
    fmt.Println(globalVar) // 函数内访问全局变量
}

全局变量可以在包内的任何函数之间共享,但应当小心使用,以避免潜在的命名冲突和不明确的引用。

提示:这里只要看懂基础的函数代码即可,后续章节会详细讲解函数。

3 基本数据类型以及零值

3.1 Golang的基本数据类型

Go语言中,每种类型的变量都提供了明确的语义和行为特征。以下是一些常见的基本数据类型:

  • intint8int16int32int64:不同范围的整数
  • uintuint8uint16uint32uint64:无符号整数
  • float32, float64:浮点数
  • bool:布尔值(true 或 false)
  • string:字符串

3.2 零值的概念

在Go语言中,变量在声明后会被自动初始化为其类型的零值。零值是指变量在没有经过显式初始化时,对应类型的默认值。这在其他一些语言中并不常见,而Go语言通过这种方式确保所有的变量总是有一个合法的初始值。以下是每种基本数据类型的零值:

  • 整数的零值是 ``
  • 浮点数的零值是 .
  • 布尔型的零值是 false
  • 字符串的零值是空字符串 ""

例如:

var i int     // 零值为
var f float64 // 零值为.
var b bool    // 零值为false
var s string  // 零值为""

了解零值的概念非常重要,它能够帮助开发人员理解变量的初始化行为,并可用于预防空指针或未初始化的错误。

4. 变量的作用域

4.1 局部变量

局部变量是定义在函数内部的变量,它们只能在该函数内被访问,函数的参数也属于局部变量。从它们被创建的那一刻起,直到函数执行完毕,局部变量才会消失。每当函数被调用时,局部变量都会重新创建。

func localVariableExample() {
    var localVariable int = 10 // 这是一个局部变量
    fmt.Println(localVariable)
}

func main() {
    localVariableExample() // 输出:10
    // fmt.Println(localVariable) // 这会引起编译错误,因为 localVariable 在这里是不可见的
}

在上面的例子中,localVariable只能在localVariableExample函数内部被访问。

4.2 全局变量

全局变量是在函数外部定义的变量,它们可以在同一包的任何文件中被访问。如果想要在其它包中使用全局变量,变量名的首字母必须大写,以符合Go的访问控制规则。

package main

import "fmt"

var globalVariable int = 20 // 这是一个全局变量

func main() {
    fmt.Println(globalVariable) // 输出:20
    changeGlobal()
    fmt.Println(globalVariable) // 输出:30
}

func changeGlobal() {
    globalVariable = 30 // 改变全局变量的值
}

在这个例子中,globalVariablemain函数和changeGlobal函数中都是可见的。

5 常量的声明与使用

5.1 const关键字

我们通过const关键字来定义常量。常量是不可修改的值,定义后就不能改变。常量可以是任意的基本数据类型,例如整数、浮点数、布尔型或字符串等。

const Pi = 3.14 // 声明一个浮点型常量
const StrConst string = "Hello, World!" // 声明一个字符串常量

func main() {
    fmt.Println(Pi)
    fmt.Println(StrConst)
}

5.2 枚举常量

Go语言没有专门的枚举类型,但可以使用iota关键字实现枚举。在一个const块,每新增一行常量声明将使iota的值自增1。

const (
    Sunday = iota  // 
    Monday         // 1
    Tuesday        // 2
    Wednesday      // 3
    Thursday       // 4
    Friday         // 5
    Saturday       // 6
)

func main() {
    fmt.Println(Sunday)    // 输出:
    fmt.Println(Saturday)  // 输出:6
}

上面的代码声明了一个星期的枚举,iotaconst块中的初始值为,每声明一行自增1。

5.3 常量的作用域

常量的作用域类似于变量。如果常量是在函数内部定义的,那么它的作用域就局限于该函数。如果常量是在函数外部(全局)定义的,那么它的作用域就是整个包,如果首字母大写,则可以在其它包中访问。

常量的作用域管理有助于减少全局作用域污染,还能提高程序的可维护性和可读性。

const GlobalConst = "这是一个全局常量"

func main() {
    const LocalConst = "这是一个局部常量"
    fmt.Println(GlobalConst)  // 这是合法的
    fmt.Println(LocalConst)   // 这是合法的
}

func anotherFunction() {
    // fmt.Println(LocalConst) // 这会引起编译错误: LocalConst 在这个函数中是不可见的
    fmt.Println(GlobalConst)  // 这是合法的
}

在这个例子中,LocalConst只能在main函数内被访问,而GlobalConst在整个包内部都可以被访问。