[ Golang 入门教程 ] 第3节——变量
什么是变量
变量是存储位置的名称,用于存储特定类型的值。在go中声明变量有各种语法。
声明一个变量
var name type
是声明单个变量的语法。
package main
import "fmt"
func main() {
var age int // variable declaration
fmt.Println("my age is", age)
}
该语句中 var age int
声明了一个名为age
的int
类型的变量。我们没有为变量分配任何值。如果没有为变量赋值,则自动初始化为符合变量类型的0
。这里,年龄被赋值为0
。如果运行此程序,则可以看到以下输出。
my age is 0
可以给变量分配其类型的任何值。在上面的程序中,年龄可以分配任何整数值。
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 // variable declaration with initial value
fmt.Println("my age is", age)
}
在上面的程序中,age是int类型的变量,并且初始值为29。如果运行上述程序,则可以看到以下输出。它显示年龄已初始化,值为29。
my age is 29
类型推断
如果变量具有初始值,Go将自动使用该初始值推断该变量的类型。因此,如果变量具有初始值,则可以省略变量声明中的类型。
如果使用语法var name = initialvalue
声明变量,Go将自动从初始值推断出该变量的类型。
在以下示例中,您可以看到变量 age 的 int 类型已在第6行中删除。由于变量的初始值为29,因此可以推断它的类型为int。
package main
import "fmt"
func main() {
var age = 29 // type will be inferred
fmt.Println("my age is", age)
}
多变量声明
可以在单个语句中声明多个变量。
var name1,name2 type = initialvalue1,initialvalue2
是多变量声明的语法。
package main
import "fmt"
func main() {
var width, height int = 100, 50 //declaring multiple variables
fmt.Println("width is", width, "height is", height)
}
如果变量具有初始值,则可以省略 类型。下面的程序声明多个变量并自动类型推断。
package main
import "fmt"
func main() {
var width, height = 100, 50 //"int" is dropped
fmt.Println("width is", width, "height is", height)
}
上述程序将输出 width is 100 height is 50
。
如果没有为宽度和高度指定初始值,则其初始值为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)
}
这里我们声明一个类型为string
的name
,类型为int
的 age
和height
。(我们将在下一个教程中讨论golang中可用的各种类型)。运行上面的程序将产生输出
my name is naveen , age is 29 and height is 0
简写声明
Go还提供了另一种简洁的方式来声明变量。这称为简写声明,它使用:=
运算符。
name:= initialvalue
是声明变量的简写语法。
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" //error
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)
}
在上面的程序中,在第8行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类型,又尝试为它分配一个字符串类型的值。
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
}