Go教程第三篇:变量
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 }
感谢您百忙之中阅读本文。如果有任何反馈和问题,请您在评论区留言。
备注
本文系翻译之作 原文博客地址