变量
1. 标准格式
(1). Go语言的变量声明的标准格式为:var 变量名 变量类型
变量声明以关键字var开头,后置变量类型,行尾无须分号。
(2). 批量格式
使用关键字var和括号,可以将一组变量定义放在一起。
var (
a int
b string
c []float
d func() bool
e struct { x int }
)
2. 简短格式
除var关键字外,还可使用更加简短的变量定义和初始化语法。
名字:=表达式
需要注意的是,简短模式(short variable declaration)有以下限制:
(1). 定义变量,同时显示初始化
(2). 不能提供数据类型
(3). 只能用在函数内部
和var形式声明语句一样,简短变量声明语句也可以用来声明和初始化一组变量:
i,j := 0,1
下面通过一段代码来演示简短格式变量声明的基本样式:
func main(){
x := 100
a,x := 1,"100"
}
因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。var形式的声明语句往往是用于显示指定变量类型的地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。
3. 初始化类型的默认值
GO语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化起类型的默认值。例如:
整型和浮点型的默认值为0和0.0
字符串变量的默认值为空字符串
布尔值默认为bool
切片,函数,指针变量的默认为nil
变量初始化的标准格式:var 变量名 类型 = 表达式
例如:var hp int = 100
4. 编译器推导类型的格式
在标准格式的基础上,将int省略后,编译器会尝试根据等号右边的表达式推到hp变量的类型。
var hp = 100
等号右边的部分在编译原理里被称为右值(rvalue)
5. 短变量声明并初始化
var的变量声明还有一种更为精简的写法,例如:
hp := 100
这是Go语言推导声明写法,编译器会自动根据右值类型判断出左值的对应类型。
注意:由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。
短变量声明并初始化格式在开发中使用比较普遍。
conn,err = net.Dial("tcp", "127.0.0.1:8080")
注意:在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,即使其他变量名可能是重复声明的,编译器也不会报错。
conn, err = net.Dial("tcp", "127.0.0.1:8080")
conn2, err = net.Dial("tcp", "127.0.0.1:8080")
上面代码片段,编译器不会报err重复定义。
6. 变量交换
var a int = 100
var b int = 200
b,a = a,b
fmt.Println(a, b)
7. 匿名变量
在编码过程中,可能会遇到没有名称的变量,类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。
匿名变量的特点是一个下画线“_”,“_”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。
匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
提示:在 Lua 等编程语言里,匿名变量也被叫做哑元变量。
Go语言变量的作用域
Go语言会在编译时检查每个变量是否使用过,一旦出现未使用的变量,就会报编译报错。
根据变量定义的位置不同,可以分为三个类型:
函数内定义的变量称为局部变量
函数外定义的变量称为全局变量
函数定义中的变量称为形式参数
1. 局部变量
在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,函数的参数和返回值变量都属于局部变量。
局部变量不是一直存在的,它只定义在它的函数被调用后存在,函数调用结束欧这个局部变量就会被销毁。
2. 全局变量
在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用"import"关键字引入全局变量所在的源文件后才能使用这个全局变量。
全局变量声明必须以var关键字开头,如果想要在外部包中使用全局变量的首字母必须大写。
Go语言程序中全局变量与局部变量名称可以相同,但是函数体内的局部变量会被优先考虑。
3. 形式参数
在定义函数时函数名后面括号中的变量叫做形式参数(简称形参)。形式参数只在函数调用时才会生效,函数调用结束后就会被销毁,在函数未被调用时,函数的行参并不占用实际的存储单元,也没有实际值。
形式参数会作为函数的局部变量来使用。
网友评论