使用var关键字能够建立一个指定类型的变量:express
var i int = 0 var i = 0 var i int
以上三个表达式均是合法的,第三个表达式会将i初始化为int类型的零值,0;若是i是bool类型,则为false;i是float64类型,则为0.0;i为string类型,则为"";i为interface类型,则为nil;i为引用类型,则为nil;若是i是struct,则是将struct中全部的字段初始化为对应类型的零值。ide
能够在同一条语句中声明多个变量:函数
var i, j, k int // int, int, int var b, f, s = true, 2.3, "four" // bool, float64, string
包内可见的变量在main函数开始执行以前初始化,本地变量在函数执行到对应的声明语句时初始化。oop
变量也能够经过函数的返回值来初始化:spa
var f, err = os.Open(name) // os.Open returns a file and an error
在函数内部,有一种短声明的方式,形式是name := expression,这里,变量的类型是由编译器自动肯定的。指针
anim := gif.GIF{LoopCount: nframes} freq := rand.Float64() * 3.0 t := 0.0
由于这种形式很是简洁,所以在函数内部(本地变量)大量使用。若是须要为本地变量显式的指定类型,或者先声明一个变量后面再赋值,那么应该使用var:code
1 i := 100 // an int 2 var boiling float64 = 100 // a float64 3 var names []string 4 var err error 5 var p Point
就像var声明同样,短声明也能够并行初始化blog
i, j := 0, 1
要谨记的是,:=是一个声明,=是一个赋值,所以在须要赋值的场所不能使用 :=ci
1 var i int 2 i := 10//panic : no new variables on left side of :=
能够利用并行赋值的特性来进行值交换:编译器
1 i, j = j, i // swap values of i and j
有一点须要注意的:短声明左边的变量未必都是新声明的!
1 in, err := os.Open(path1) //新声明两个变量:in, err 2 //... 3 out, err := os.Create(path2) 4 /*由于err已经声明过,所以这里只新声明一个变量out。 5 虽然这里使用:=,可是err是在上个语句声明的,这里仅仅是赋值*/
并且,短声明的左边变量必须有一个是新的,若都是以前声明过的,会报编译错误:
1 f, err := os.Open(infile) 2 // ... 3 f, err := os.Create(outfile) // compile error: no new variables
正确的写法是这样的:
1 f, err := os.Open(infile) 2 // ... 3 f, err = os.Create(outfile) // compile ok