变量和声明
如果我们用 x = 4 来声明和赋值变量,那么我们就可以同时开始和结束对变量的查看了。遗憾的是,Go 更为复杂些。我们将通过简单的示例来开始我们的学习。然后,在下一章中,我们会在创建和使用结构体时,进一步扩展。尽管如此,你可能还得花一段时间来适应,才能感受到它带给你的舒适感。
你可能会想:“哇!这有什么复杂的?”。 让我们开始一个例子。
下面的例子是 Go 中,声明变量和赋值最为明确的方法,但也是最为冗长的方法:
package main
import (
"fmt"
)
func main() {
var power int
power = 9000
fmt.Printf("It's over %d\n", power)
}
这里我们定义了一个 int
类型的变量 power
。默认情况下,Go 会为变量分配默认值。Integers 的默认值是 0
,booleans 默认值是 false
,strings 默认值是 ""
等等。下面,我们创建一个值为 9000
的名为 power
的变量。我们可以将定义和赋值两行代码合并起来:
var power int = 9000
不过,这么写太长了。Go 提供了一个方便的短变量声明运算符 :=
,它可以自动推断变量类型:
power := 9000
这非常方便,它可以跟函数结合使用,就像这样:
func main() {
power := getPower()
}
func getPower() int {
return 9001
}
值得注意的是要用 :=
来声明变量以及给变量赋值。相同变量不能被声明两次(在相同作用域下),如果你尝试这样,会收到错误提示。
func main() {
power := 9000
fmt.Printf("It's over %d\n", power)
// 编译器错误:
// := 左侧不是新的变量
power := 9001
fmt.Printf("It's also over %d\n", power)
}
编译器会告诉你 := 左侧不是新的变量。这就意味着当我们首次声明一个变量时应该使用 :=
,后面再给变量赋值时应该使用 =
。这似乎很有道理,但是凭空来记忆且需要根据情况来切换却是很难的事。
如果你仔细阅读代码的错误信息,你会发现 variables 单词是个复数,即有多个变量,那是因为go支持多个变量同时赋值(使用 =
或者 :=
):
func main() {
name, power := "Goku", 9000
fmt.Printf("%s's power is over %d\n", name, power)
}
另外,多个变量赋值的时候,只要其中有一个变量是新的,就可以使用:=
。例如:
func main() {
power := 1000
fmt.Printf("default power is %d\n", power)
name, power := "Goku", 9000
fmt.Printf("%s's power is over %d\n", name, power)
}
尽管变量 power
使用了两次:=
,但是编译器不会在第 2 次使用 :=
时报错,因为这里有一个新的 name
变量,它可以使用:=
。然后你不能改变 power
变量的类型,它已经被声明成一个整型,所以只能赋值整数。
到目前为止,你最后需要了解的一件事是,Go 会像 import 一样,不允许你在程序中拥有未使用的变量。例如:
func main() {
name, power := "Goku", 1000
fmt.Printf("default power is %d\n", power)
}
这将不会通过编译,因为 name
是一个被声明但是未被使用的变量,就像 import 的包未被使用时,也将会导致编译失败,但总的来说,我认为这有助于提高代码的清洁度和可读性。
还有更多关于声明和赋值的技巧。初始化一个变量时,请使用:var NAME TYPE
;给变量声明及赋值时,请使用: NAME := VALUE
; 给之前已经声明过的变量赋值时,请使用: NAME = VALUE