Go教程第三篇:变量
本文是《Golang系列教程》第三篇文章,它主要讲解golang中变量的用法。
什么是变量
变量是一个内存位置的名称,这个内存位置是用于指定类型的值。在go语言中,有许多不同的语法来声明一个变量。
声明单一变量
声明单一变量的语法: var name type。
package main
import "fmt"
func main() {
var age int // 变量声明
fmt.Println("my age is", age)
}
var age int 语句声明了一个名称为age,数据类型为int的变量。我们没有为该变量指定任何值。
如果一个变量没有指定任何值的话,go会自动地把它初始化为该数据类型所对应的零值。
在本例子中,age会被指定一个0值。如果你运行这个程序,你就可以看到下面的输出:
my age is 0
一个变量可以指定为其类型所能对应的任意值。在上面的程序中,age可以被赋值为任意的整数值。
package main
import "fmt"
func main() {
var age int // variable declaration
fmt.Println("my age is ", age)
age = 29 //assignment
fmt.Println("my age is", age)
age = 54 //assignment
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。如果你运行上面的程序
,你可以看到如下输出。这也就表明age已经被初始化了一个29的值。
my age is 29
类型引用
如果变量有一个初始值,Go会自动地根据该初始值推断出此变量的数据类型。因此,如果一个变量有初始值的话,
我们可以在变量声明里面,把类型省略掉。
如果变量使用 var name =initialvalue 进行声明,Go将自动根据初始值推断出变量类型。
在下面的例子中,你可以看到 在age变量声明里面已经没有的int类型了,因为该变量有一个初始值为29,
go可以很轻易地推断出它的类型是int。
package main
import "fmt"
func main() {
var age = 29 // 自动推断变量类型
fmt.Println("my age is", age)
}
多变量声明
我们可以在单一的语句中声明多个变量。
其语法如下:
var name1, name2 type = initialvalue1,initialvalue2
具体代码如下:
package main
import "fmt"
func main() {
var width, height int = 100, 50 //声明多个变量
fmt.Println("width is", width, "height is", height)
}
如果这些变量有初始值的话,类型也是可以省略的。下面的程序将使用类型推断来声明多个变量。
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指定初始值的话,他们将把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("new width is", width, "new height is ", height)
}
上面的程序将输出如下:
width is 0 height is 0
new width is 100 new 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)
}
快捷声明(short hand declaration)
Go 也提供了另一种简洁方式声明变量。也被称为 快捷声明,它使用 := 操作符来做到这一点。
语法如下:
name :=initialvale
package main
import "fmt"
func main() {
name, age := "naveen", 29 //short hand declaration
fmt.Println("my name is", name, "age is", age)
}
你如果运行上面的程序,你就可以看到会输出 my name is naveen age is 29。
快捷声明需要为每个变量指定初始值。例如下面的程序就会抛出一个错误: cannot assign 1 values to 2 variables。这是因为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 // declare variables a and b
fmt.Println("a is", a, "b is", b)
b, c := 40, 50 // b is already declared but c is new
fmt.Println("b is", b, "c is", c)
b, c = 80, 90 // assign new values to already declared variables b and c
fmt.Println("changed b is", b, "c is", c)
}
在上面的程序中,在第八行,b之前已经被声明过了,而c是新声明的。它的运行结果是:
a is 20 b is 30
b is 40 c is 50
changed b is 80 c is 90
反之,如果我们运行下面的程序的话,将是错误的:
package main
import "fmt"
func main() {
a, b := 20, 30 //a and b declared
fmt.Println("a is", a, "b is", b)
a, b := 40, 50 //error, no new variables
}
它将抛出错误:no new variables on left side of := 。这是因为不管是a还是b都是已经在先前已经声明过的。
在操作符:=的左侧没有任何新的变量。
另外,给变量指定的值也可以是运行时计算出来的。像下面的程序:
package main
import (
"fmt"
"math"
)
func main() {
a, b := 145.8, 543.8
c := math.Min(a, b)
fmt.Println("minimum value is ", c)
}
在上面的程序中,变量c的值是在运行时期计算出来的,它是a和b的最小值。上面的程序将输出如下:
minimum value is 145.8
由于Go是一个强类型的语言,所以,如果在变量声明时指定了一个数据类型,那么就不允许给该变量指定
另一个数据类型的值。下面的程序就会抛出一个错误: cannot use "naveen" (type string) as type int in assignment。
因为age在声明时指定的数据类型是int,而我们却给其指定了一个string类型的值。
package main
func main() {
age := 29 // age is int
age = "naveen" // error since we are trying to assign a string to a variable of type int
}
感谢您百忙之中阅读本文。如果有任何反馈和问题,请您在评论区留言。
备注
本文系翻译之作原文博客地址
有疑问加站长微信联系(非本文作者)