文章目录
- 变量
- 变量的声明
- 变量的初始化
- 多个变量同时赋值
- 匿名变量
- 作用域
变量
变量的声明
Go语言是静态类型语言,变量拥有明确的类型,编译器也会检查变量类型的正确性。
在Go语言中,声明变量时将变量的类型放在变量的名称之后,避免含糊不清的声明形式。
通过下面代码了解变量声明的基本样式
var a int
var b string
var c []float32
var d func() bool
var e struct {
x int
}
代码说明:
- 第一行,声明一个整形类型的变量,可以保存整数数值。
- 第二行,声明一个字符类型的变量。
- 第三行,声明一个32位浮点切片类型的变量,浮点切片表示由多个浮点类型组成的数据结构。
- 第四行,声明一个返回值为布尔类型的函数变量,这种形式一般用于回调函数,即将函数以变量的形式保存下来,在需要的时候重新调用这个函数。
- 第五行,声明一个结构体类型的变量,这个结构体拥有一个整形的x字段。
当一个变量被声明之后,系统会自动赋予它该类型的零值:nt 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil 等。所有内存在Go中都是经过初始化的。
比如上面的程序输出为
//0和【】中间有一个空白字符串
0 [] <nil> {0}
变量的声明主要有以下几种
标准格式
格式为:
var 变量名 变量类型
声明变量以关键字var开头,后置变量类型,末尾不需要分号。
批量格式
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)
使用关键字var和括号,可以将一组变量定义放在一起。
简短格式
//简短格式
i := 0
fmt.Println(i)
简短格式有以下限制:
- 定义变量,同时显示初始化
- 不能提供数据类型
- 只能用于函数内部
简短格式拥有简洁和灵活的特点,被广泛用于大部分的局部变量的声明和初始化,往往用于显式指定变量类型的地方,或者因为变量稍后会被重新赋值而初始化无关紧要的地方。
变量的初始化
Go语言在声明变量时会自动对变量对应的内存区域进行初始化操作,会赋予对应的初始化值。也可以在变量声明时赋予变量一个初始值。
标准格式
var 变量名 类型 = 表达式
例如:
//标准格式的初始化
var hp int = 100
fmt.Println(hp)
编译器推导类型的格式
在标准格式的基础上,将int省略后,编译器会尝试根据等号右边的表达式推导变量类型
//推到格式
var dp = 60
fmt.Println(dp)
等号右边的部分在编译原理被称为右值(rvalue)
短变量声明并初始化
//短变量声明并初始化
bp := 80
fmt.Println(bp)
这也是推导声明写法,编译器回自动根据右值类型推断出左值的对应类型。
如果左值已经被声明过了,但依然使用
:=
时编译器会报错。
例如:
在多个短变量的声明和赋值中,只要至少有一个新变量出现在左值中,编译器就不会报错。
多个变量同时赋值
var a int = 10
var b int = 20
b, a = a, b
fmt.Println(a, b)
变量的左值和右值按从左到右的顺序赋值
匿名变量
如果不需要在左值中接收变量,可以使用匿名变量
匿名变量的特点是一个下画线_,“_”本身就是一个特殊的标识符,被称为空白标识符。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
匿名变量不占用命名空间,不会分配内存。匿名变量和匿名变量之间也不会因为多次声明而无法使用。
作用域
根据变量定义位置的不同,可以分为以下三个类型:
- 函数内定义的变量称为局部变量
- 函数外定义的变量称为全局变量
- 函数定义中的变量称为形式参数
局部变量
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。
局部变量不是一直存在的,它只在定义它的函数被调用后存在,函数调用结束后这个局部变量就会被销
package main
import (
"fmt"
)
func main() {
//声明局部变量 a 和 b 并赋值
var a int = 3
var b int = 4
//声明局部变量 c 并计算 a 和 b 的和
c := a + b
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
结果:
a = 3, b = 4, c = 7
全局变量
在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用“import”关键字引入全局变量所在的源文件之后才能使用这个全局变量。
全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。
package main
import "fmt"
//声明全局变量
var c int
func main() {
//声明局部变量
var a, b int
//初始化参数
a = 3
b = 4
c = a + b
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
结果:
a = 3, b = 4, c = 7
Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的局部变量会被优先考虑
例如:
package main
import "fmt"
//声明全局变量
var c int = 10
func main() {
//声明局部变量
var a, b int
//初始化参数
a = 3
b = 4
c = a + b
fmt.Printf("a = %d, b = %d, c = %d\n", a, b, c)
}
结果:
a = 3, b = 4, c = 7
形式参数
在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的形参并不占用实际的存储单元,也没有实际值。
形式参数会作为函数的局部变量来使用。