介绍
变量是几乎所有编程语言中最基本的组成元素。从根本上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。
Go语言中的变量使用方式与C语言接近,但具备更大的灵活性。
1. 变量声明
Go语言中引入了关键字var,并且类型信息需要放在变量名之后。如下:
var v1 int
var v2 string
var v3 [10]int // 数组
在声明完变量之后不需要使用分号作为结束符。同时var关键字的另一种用法是可以将若干个需要声明的变量放置在一起,免得程序员需要重复写var关键字,如下所示:
var (
v1 int
v2 string
)
2. 变量初始化
对于声明变量时需要进行初始化的场景,var 关键字可以保留,但不再是必要的元素。例如:
var i int = 10 // 使用方法正确
var x = 10 // 使用方法正确,编译器可以推导出类型
y := 20 // 正确,编译器可以推导出类型
go中引入的 := 用于明确表达同时进行变量的声明和初始化操作。
在go中,指定类型不在是必须。Go的编译器可以从初始化表达式的右值推导出变量应该声明为哪种类型。
需要注意的是,变量使用:=不应该是已经被声明过的,否则就会导致编译错误。例如:
var i int
i := 2
出现的错误类似于下面:
no new variables on left side of :=
3.变量赋值
在Go中,变量的初始化和变量的赋值是两个完全不同的概念。例如下面的代码,是声明一个变量之后的赋值过程:
var a int
a = 10
多重赋值
Go中的多重赋值功能,可以参考下面的代码:
i, j = j,i
而上面这种交换变量的行为在不支持多重赋值的语言当中,交互两个变量就需要引入一个中间变量。
t = i;i=j,j=t
匿名变量
在很多传统的强类型语言中,,经常会出现这种情况,即在调用函数时为了获取一个值,却因为该函数返回多个值而不得不定义一堆没用的变量。在Go中这种情况可以通过结合使用多重返回和匿名变量来避免这种丑陋的写法,让代码看起来更加优雅。
假 设GetName()函数的定义如下,它返回3个值,分别为firstName、lastName和nickName:
func GetName() (firstName,lastName,nickName string) {
return "May", "Chen" , "Chibi Maruko"
}
若只想获取nickName ,则函数的调用语句可以如下:
_,_,nickName := GetName() // _(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃
这种用法可以让代码非常清晰,基本上屏蔽掉了可能混淆代码阅读者视线的内容,从而大幅降低沟通的复杂度和代码维护的难度。
变量示例代码:
package main
import "fmt"
var x1 int // 在当前的代码中,x1 声明但是并未使用,那么go在编译阶段就会报错
var v2 = 10 // 在函数外部定义的全局变量不能再使用 := 的形式,一旦使用则无法编译通过,所有一般用var 来定义全局变量
func main() {
v1 := "hello,world" // 这种简化的写法只能再函数内部使用
fmt.Print(v1)
fmt.Print(v2)
}