三.golang的变量
变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。
package main import "fmt" func main() { var age int // 变量声明 fmt.Println("my age is", age) }
语句 var age int
my age is 0
变量可以赋值为本类型的任何值。上一程序中的 age 可以赋值为任何整型值(Integer Value)。
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
package main import "fmt" func main() { var age int = 29 // 声明变量并初始化 fmt.Println("my age is", age) }
在上面的程序中,age 是具有初始值 29 的 int 类型变量。如果你运行上面的程序,你可以看见下面的输出,证实 age 已经被初始化为 29。
my age is 29
如果变量有初始值,那么 Go 能够自动推断具有初始值的变量的类型。因此,如果变量有初始值,就可以在变量声明中省略 type。
在下面的例子中,你可以看到在第 6 行,我们省略了变量 age 的 int 类型,Go 依然推断出了它是 int 类型。
package main import "fmt" func main() { var age = 29 // 可以推断类型 fmt.Println("my age is", age) }
Go 能够通过一条语句声明多个变量。
声明多个变量的语法是 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", heigh) }
你可能已经想到,如果 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) }
Go 也支持一种声明变量的简洁形式,称为简短声明(Short Hand Declaration),该声明使用了 := 操作符。
声明变量的简短语法是 name := initialvalue。
package main import "fmt" func main() { name, age := "naveen", 29 // 简短声明 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 // 声明变量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("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和b fmt.Println("a is", a, "b is", b) a, b := 40, 50 // 错误,没有尚未声明的变量 }
变量也可以在运行时进行赋值。考虑下面的程序:
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
package main func main() { age := 29 // age是int类型 age = "naveen" // 错误,尝试赋值一个字符串给int类型变量 }