变量
变量定义
var
语句定义一个变量的列表;跟函数的参数列表一样,类型在后面。
var
语句可以定义在包或函数级别。
var c, python, java bool
func main() {
var i int
fmt.Println(i, c, python, java)
}
变量初始化
// 变量定义可以包含初始值,每个变量对应一个。
var i, j int = 1, 2
func main() {
// 如果初始化是使用表达式,则可以省略类型;
// 变量从初始值中获得类型。
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
也可以用这个方式初始化多个变量,每个变量一行代码:
var (
ToBe bool = false
MaxInt uint64 = 1<<64 - 1
z complex128 = cmplx.Sqrt(-5 + 12i)
)
如果变量在定义时没有明确的初始化,则会赋值为该类型对应的零值:
- 数值类型为
0
, - 布尔类型为
false
, - 字符串为
""
(空字符串)
短声明变量
在函数中,:=
简洁赋值语句在明确类型的地方,可以用于替代 var
定义。
func main() {
var i, j int = 1, 2
k := 3
c, python, java := true, false, "no!"
}
函数外的每个语句都必须以关键字开始(var
、func
、等等),:=
结构不能使用在函数外。
多赋值模式
上面同时赋值多个变量的模式,可以用于if, for 等语句,实现在if, for 语句中的多赋值模式:
for i, j, s := 0, 5, "a"; i < 3 && j < 100 && s != "aaaaa"; i, j, s = i+1, j+1, s + "a" {
fmt.Println("Value of i, j, s:", i, j, s)
}
go语言规范
https://golang.org/ref/spec#Variables
变量是用来存放数值的存储位置。允许的值集由变量的类型决定。
变量声明,或者对于函数参数和结果,函数声明或函数字面量的签名为命名的变量保留了存储空间。调用内置函数new或取复合字面的地址,在运行时为变量分配存储空间。这样的匿名变量是通过(可能是隐含的)指针间接引用的。
数组、切片和结构体类型的结构化变量具有可以单独寻址的元素和字段。每个这样的元素都像一个变量一样。
变量的静态类型(或者说只是类型)是在它的声明中给出的类型,新调用或复合文字中提供的类型,或者是结构变量的元素的类型。接口类型的变量也有一个独特的动态类型,它是在运行时分配给变量的值的具体类型(除非该值是预先声明的标识符nil,它没有类型)。动态类型在执行过程中可能会发生变化,但存储在接口变量中的值总是可以分配给变量的静态类型。
var x interface{} // x 是 nil,它有一个静态类型 interface{}
var v *T // v 的值为 nil,静态类型为 *T
x = 42 // x 的值为 42,动态类型为 int
x = v // x 的值为 (*T)(nil),动态类型为 *T
变量的值通过在表达式中引用变量来检索;它是分配给变量的最新值。如果一个变量还没有被赋值,它的值就是它的类型的零值。
Effective Go
https://golang.org/doc/effective_go.html#variables
变量可以像常量一样被初始化,但初始化器可以是一个在运行时计算的通用表达式。
var (
home = os.Getenv("HOME")
user = os.Getenv("USER")
gopath = os.Getenv("GOPATH")
)