Golang - 变量声明

路漫漫其修远兮,吾将上下而求索。

声明一个变量

在Go中,变量是包含值的一块存储。可以使用变量声明为变量命名。只需使用var关键字,后跟所需的名称以及变量将保存的值的类型。

1
var name string

使用 = 号为其赋值

1
2
var name string = "Martin"
name = "MartinHua"

声明多个变量

使用 , 号分隔变量名可以一次性声明多个变量

1
var firstName,lastName string

为多个变量赋值

1
2
var firstName,lastName string = "培亮","花"
firstName,lastName = "培亮","花"

如何确认变量类型

同 java 一样,我们无法将一个数字类型的值赋值给一个字符串类型的变量。如果需要确认变量类型可以使用 refect 包的 TypeOf 函数。

1
2
3
4
func main() {
    var name string = "martin"
    fmt.Println(reflect.TypeOf(name))
}

零值

与 java 不同的是,如果声明一个变量而没有给它赋值,该变量将被赋值为其类型的零值。

数值类型的零值是 0 字符串类型的零值是空字符串 布尔类型的零值是 false …

示例:

1
2
3
4
func main() {
    var name bool
    fmt.Println(name)
}

输出:

1
false

短变量声明

如果你声明变量时就知道它的初始值是什么,那么更具有代表性的是使用短变量声明。你不必很明确地声明变量的类型并在之后使用=为其赋值。

1
2
3
4
5
6
func main() {
	firstName := "培亮"
	var lastName = "花"
	fmt.Println(firstName)
	fmt.Println(lastName)
}

“变量名 = 值”是不允许的,下面是错误示例:

1
2
3
4
func main() {
	name = "Martin"
	fmt.Println(name)
}

命名规则

Go 有一套简单的规则,适用于变量、函数和类型的名称:

  • 名称必须以字母开头,并且可以有任意数量的额外的字母和数字。
  • 如果变量、函数或类型的名称以大写字母开头,则认为它是导出的,可以从当前包之外的包访问它。 (这就是为什么 fmt.Println 中的 P 是大写的:这样它就可以在 main 包或任何其他包中使用。) 如果变量/函数/类型的名称是以小写字母开头的,则认为该名称是未导出的,只能在当前包中使用。

重复声明同一变量名的变量

在同一作用域中重复声明同一变量名的变量是不允许的。

示例一:

1
2
3
4
5
func main() {
	name := "Martin"
	name := "Martin"
	fmt.Println(name)
}

编译错误:

1
no new variables on left side of := (exit status 2)

示例二:

1
2
3
4
5
func main() {
	name := "Martin"
	var name string
	fmt.Println(name)
}

编译错误:

1
1
name redeclared in this block

但如果短变量声明中至少有一个变量名是新的,这是允许的。新变量名被视为声明,而现有的名字被视为赋值。

示例:

1
2
3
4
5
6
func main() {
	name := "Martin"
	name, chineseName := "Martin", "花培亮"
	fmt.Println(name)
	fmt.Println(chineseName)
}

输出:

1
2
Martin
花培亮

如果不使用短变量声明会是怎么样呢?

示例:

1
2
3
4
5
6
func main() {
	name := "Martin"
	var name, chineseName string = "Martin", "花培亮"
	fmt.Println(name)
	fmt.Println(chineseName)
}

编译错误:

1
1
name redeclared in this block