变量只是程序可以操作的存储区域的名称。Go中的每个变量都有一个特定的类型,它决定了该变量的内存的大小和布局、可以存储在该内存中的值的范围,以及可以应用于该变量的一组操作。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为Go是区分大小写的。基于前一章中解释的基本类型,将会有以下基本变量类型&减号;
序号 | 类型 |
---|---|
1 | byte |
2 | int |
3 | float32 |
Go编程语言还允许定义各种其他类型的变量,如枚举、指针、数组、结构和联合,这些我们将在后面的章节中讨论。在本章中,我们将只关注基本的变量类型
变量定义告诉编译器在哪里为变量创建多少存储空间。变量定义指定一种数据类型,并包含该类型的一个或多个变量的列表:
var variable_list optional_data_type;
optional_data_type是一个有效的Go数据类型,包括byte、int、float32、complex64、boolean或任何用户定义的对象等,而variable_list可以由一个或多个用逗号分隔的标识符名称组成。下面显示了一些有效的声明:
var i, j, k int; var c, ch byte; var f, salary float32; d = 42;
vari, j, k;声明并定义了变量i, j, k;它指示编译器创建类型为int的变量i、j和k。
变量可以在声明中进行初始化(赋值)。变量的类型由编译器根据传递给它的值自动判断。初始化器由一个等号和一个常量表达式组成,如下所示:
variable_name = value;
例如
d = 3, f = 5; // declaration of d and f. Here d and f are int
对于没有初始化器的定义:静态存储持续时间的变量被隐式地初始化为nil(所有字节的值为0);所有其他变量的初始值为其数据类型的零值。
静态类型变量声明向编译器保证有一个具有给定类型和名称的变量,以便编译器可以继续进行进一步编译,而不需要该变量的完整详细信息。变量声明只有在编译时才有意义,编译器在链接程序时需要实际的变量声明。
试一下下面的例子,变量已经用类型声明并且初始化在主函数;
package main import "fmt" func main() { var x float64 x = 20.0 fmt.Println(x) fmt.Printf("x is of type %T\n", x) }
当编译并执行上述代码时,会产生以下结果;
20 x is of type float64
动态类型变量声明要求编译器根据传递给它的值解释变量的类型。编译器不需要将变量静态地具有类型作为必要要求。
尝试下面的示例,其中变量声明时没有任何类型。注意,对于类型推断,我们使用:=操作符初始化变量y,而使用=操作符初始化x.
package main import "fmt" func main() { var x float64 = 20.0 y := 42 fmt.Println(x) fmt.Println(y) fmt.Printf("x is of type %T\n", x) fmt.Printf("y is of type %T\n", y) }
当编译并执行上述代码时,会产生以下结果;
20 42 x is of type float64 y is of type int
可以使用类型推断一次性声明不同类型的变量。
package main import "fmt" func main() { var a, b, c = 3, 4, "foo" fmt.Println(a) fmt.Println(b) fmt.Println(c) fmt.Printf("a is of type %T\n", a) fmt.Printf("b is of type %T\n", b) fmt.Printf("c is of type %T\n", c) }
当上面的代码被编译和执行时,它会产生以下结果
3 4 foo a is of type int b is of type int c is of type string