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
在上述的批量声明中,firstName
和lastName
被声明为字符串类型,而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语言中,每种类型的变量都提供了明确的语义和行为特征。以下是一些常见的基本数据类型:
int
,int8
,int16
,int32
,int64
:不同范围的整数uint
,uint8
,uint16
,uint32
,uint64
:无符号整数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 // 改变全局变量的值
}
在这个例子中,globalVariable
在main
函数和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
}
上面的代码声明了一个星期的枚举,iota
在const
块中的初始值为,每声明一行自增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
在整个包内部都可以被访问。