变量
本篇是我们整个Golang教程系列的第三个教程,将会讲述涉及Golang变量的内容
什么是一个变量?
变量是一个内存单元存储一个指定类型的值的名称,在Go中有多种声明变量的语法。接下来让我们一个一个地看。
声明一个单独变量
var name type这个语法是声明一个单独的变量
package main
import "fmt"
func main() {
var age int // 声明变量
fmt.Println("My age is",age)
}
这个语句var age int声明了一个int类型命名为age的变量。我们并没有给这个变量赋值,如果一个变量没有被赋值,那么Go就会自动初始化这个变量的类型的零值(zero value),在这个例子中,age就默认赋值为0,因为int的零值(zero value)就是0。如果你运行这个程序,你就会看到下面的输出。
My age is 0
一个变量可以被赋予它的数据类型的任何数值,在上面的程序中,age就可以被赋予多个整数值。
package main
import "fmt"
func main() {
var age int // 声明变量
fmt.Println("My age is",age)
age = 29 // 赋值
fmt.Println("My age is", age)
age = 54 // 赋值
fmt.Println("my new age is",age)
}
上面的程序将会打印下面的输出
My age is 0
My age is 29
my new age is 54
声明一个带有初始值的变量
一个变量也可以在它定义的时候提供一个初始值。下面的语句就是声明一个带有初始值的变量。
var name type = initialvalue
package main
import "fmt"
func main() {
var age int = 29 // 声明变量
fmt.Println("My age is",age)
}
在上面的程序中,age是一个int类型的变量,它的初始值是29,它将会打印下面的输出
My age is 29
它打印出了age的初始值29
类型推断
如果一个变量有一个初始值,Go就会自动判断这个变量的初始值的类型。因此,如果一个变量已经有了一个初始值,那么就可以把变量的type声明移除。
如果你用下面的语句声明变量
var name = initialvalue
Go就会自动根据变量的初始值来判断它的类型。
在下面的例子中,我们可以看到在age中变量声明中已经移除了int的类型,由于变量已经有一个初始值29,那么Go就可以推断这个变量的类型是int
package main
import "fmt"
func main() {
var age = 29 // Go将会推断变量类型
fmt.Println("My age is", age)
}
多变量声明
可以用一条语句来声明多个变量。
var name1,name2 type = initiavalue1,initiavalue2,这就是声明多个变量的语句。
package main
import "fmt"
func main() {
var width, height int = 100,50 // 声明多个变量
fmt.Println("width is ",width,"height is ",height)
}
当变量赋有初始值时,可以移除type,因为上面的程序变量都有初始值,所以int类型就可以移除了。
package main
import "fmt"
func main() {
var width, height = 100,50 // 去掉了 "int"
fmt.Println("width is ",width,"height is ",height)
}
上面的程序也一样会打印出width is 100 height is 50
正如你可能猜想的那样,如果没有为width和height赋予初始值,那么Go就会自动给它们的初始值赋为0
package main
import "fmt"
func main() {
var width, height int
fmt.Println("width is ",width,"height is ",height)
width = 100
height = 50
fmt.Println("width is ",width,"height is ",height)
}
上面的程序就会输出
width is 0 height is 0
width is 100 height is 50
有个问题就是如果你想在一条语句中定义多个不同类型的变量,那么这个语句可以这么做
var (
name1 = initialvalue1
name2 = initialvalue2
)
下面的程序就是使用了上面的语句声明了不同的变量类型
package main
import "fmt"
func main() {
var (
name = "naveen"
age = 29
height int
)
fmt.Println("my name is ",name,",age is ",age,",and height is ",height)
}
在这里,我们声明了变量name的类型为string,age和height的类型是int。(关于变量类型,我们会在下个教程学习Golang存在的不同的变量类型)
执行上面的程序,我们会看到输出
my name is naveen ,age is 29 ,and height is 0
简短声明
Go也提供了另外一种简单声明变量的方式。就是简短声明(short hand declaration),使用:=操作符。
name := initialvalue 这个语法就是简短声明一个变量。
下面的程序就使用了简短语法声明了变量count并且初始化为10,因为它的初始值为整数10,那么Go就会自动判断count的变量类型为int。
package main
import "fmt"
func main() {
count := 10
fmt.Println("Count =",count)
}
执行上面的程序会打印出
Count = 10
在一行代码中使用简短语法来声明多个变量也是ok的。
package main
import "fmt"
func main() {
name,age := "naveen",29
fmt.Println("my name is ",name,"age is",age)
}
上面的程序分别声明了两个变量,string类型的name和int类型的age。
如果你运行上面的程序,那么你就会看到my name is naveen age is 29的输出。
简短声明需要给左边的所有变量赋予初始值,不然就会报错。下面的程序就打印一个错误assignment mismatch: 2 variables but 1 value,这是因为age没有被赋值
package main
import "fmt"
func main() {
name,age := "naveen" //报错
fmt.Println("my name is ",name,"age is",age)
}
使用简短语法时要保证在:=的左边至少有一个未被声明过的变量,思考下下面的程序。
package main
import "fmt"
func main() {
a,b := 20,30 // 定义a、b变量
fmt.Println("a is",a,"b is ",b)
b,c := 40,50 // b已经被定义了的,但是c还是新的
fmt.Println("b is",b,"c is ",c)
b,c = 80,90 // 重新赋新值已经被定义过的变量b,c
fmt.Println("b is",b,"c is ",c)
}
在上面的程序中,b,c := 40,50,其中b已经在前面被声明过了,但是c还是未被声明的,所以它是可以正常运行的,输出下面的内容。
a is 20 b is 30
b is 40 c is 50
b is 80 c is 90
但如果我们运行下面的程序
package main
import "fmt"
func main() {
a,b := 20,30 // 定义a、b变量
fmt.Println("a is",a,"b is ",b)
a,b := 40,50 // 错误,没有声明新的变量
}
那么它就会报错no new variables on left side of :=, 这是因为在a,b := 40,50之前,变量a,b都已经被声明过了,也就是说这个简短语法在:=左边没有新的变量。
变量也可以在程序运行的时候赋值。思考下面的程序。
package main
import (
"fmt"
"math"
)
func main() {
a,b := 124.8,543.8 // 定义a、b变量
c := math.Min(a,b)
fmt.Println("Mininum value is", c)
}
在上面的程序中,math是一个包(package),而Min就是这个包中的一个函数。不过现在你先不必担心包的内容,我们将会在接下来的教程中继续学习包和函数的细节。我们只需要知道的是,c是在程序运行时计算出来的,它是a和b中较小的那个。执行上面的程序将会打印出:
Mininum value is 124.8
因为Go是强类型的语言,一个变量已经声明了一种类型,那么就不能再赋予另外一种类型的值。
package main
import (
"fmt"
"math"
)
func main() {
age := 29 // age为int类型
age = "marvel" // 报错, 因为age已经声明为int, 但是这里又给它赋值了字符串
}
以上就是本篇的内容。
感谢阅读,这是我第一次翻译,难免会有翻译不当的地方,如果有什么反馈和评论,欢迎提出来!
浙公网安备 33010602011771号