本文最初发表在我的个人博客,查看原文,获得更好的阅读体验
Go 使用var
关键字声明变量;使用关键字const
声明常量。变量可以像常量一样初始化。
一 变量
1.1 变量声明
语法:
var 变量名 变量类型 | = 值
var x int
var y string = "hello"
var z = 2
var c, python, java = true, false, "no!"
var r, s int
预声明的值nil
不能用于初始化没有显式类型的变量。
var n = nil // 非法
另外,还可以使用短变量声明运算符:=
来声明变量,以下声明是等价的:
a := 2
var a = 2
短变量声明可能仅出现在函数内部。在某些上下文中,例如if
,for
或switch
语句的初始化程序,它们可用于声明本地临时变量。
实现限制:如果在函数体内声明了变量却未使用,编译器可能认为是非法的。
初始值也可以是一个在运行时计算的一般表达式
var (
home = os.Getenv("HOME")
user = os.Getenv("USER")
gopath = os.Getenv("GOPATH")
)
调用内置函数new
或获取复合字面量的地址,会在运行时为变量分配存储空间。这种匿名变量通过指针重定向来引用(可能是隐式的)。
数组,切片和结构类型的结构化变量具有可单独寻址的元素和字段。每个这样的元素就像一个变量。
1.2 变量的类型
声明时给出的类型、调用new
函数或在复合字面量中提供的类型,或结构化变量的元素类型,称为变量的静态类型(或仅仅类型)。
接口类型的变量甚至具有不同的动态类型,它是在运行时分配给变量的值的具体类型(除非该值是预先声明的标识符nil,它没有类型)。动态类型在执行期间可能会有所不同,但存储在接口变量中的值始终可分配给变量的静态类型。
var x interface{
} // x is nil and has static type interface{}
var v *T // v has value nil, static type *T
x = 42 // x has value 42 and dynamic type int
x = v // x has value (*T)(nil) and dynamic type *T
如果尚未为变量赋值,则其值为其类型的零值。
二 常量
Go中的常量有:布尔常量,符文常量,整数常量,浮点常数,复数常量和字符串常量。符文,整数,浮点和复数常量统称为数字常量。常量就是不变量。它们在编译期间创建。即使在函数中定义为局部常量,也是如此。
由于编译时限制,定义它们的表达式必须是可被编译器求值的常量表达式。例如,1<<3
是常量表达式,而math.Sin(math.Pi/4)
不是,因为函数调用math.Sin
需要在运行时发生。
2.1 常量声明
常量的声明与变量类似,只不过是使用const
关键字。常量声明将标识符列表(常量的名称)绑定到常量表达式列表的值。标识符的数量必须等于表达式的数量,左侧的第n个标识符绑定到右侧的第n个表达式的值。
如果存在类型,则所有常量都采用指定的类型,并且表达式必须可分配给该类型。如果省略该类型,则常量将采用相应表达式的各个类型。
const Pi float64 = 3.14159265358979323846
const zero = 0.0 // untyped floating-point constant
const (
size int64 = 1024
eof = -1 // untyped integer constant
)
const a, b, c = 3, 4, "foo" // a = 3, b = 4, c = "foo", untyped integer and string constants
const u, v float32 = 0, 3 // u = 0.0, v = 3.0
在带括号的const
声明列表中