变量

本篇是我们整个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的类型为stringageheight的类型是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类型的nameint类型的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是在程序运行时计算出来的,它是ab中较小的那个。执行上面的程序将会打印出:

Mininum value is 124.8

因为Go是强类型的语言,一个变量已经声明了一种类型,那么就不能再赋予另外一种类型的值。

package main

import (
	"fmt"
	"math"
)

func main() {

	age := 29 // age为int类型
	age = "marvel" // 报错, 因为age已经声明为int, 但是这里又给它赋值了字符串

}

以上就是本篇的内容。

感谢阅读,这是我第一次翻译,难免会有翻译不当的地方,如果有什么反馈和评论,欢迎提出来!

原文地址: https://golangbot.com/variables/