1.变量
1.1 声明变量
使用var关键字可以创建一个指定类型的变量:
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中所有的字段初始化为对应类型的零值。
可以在同一条语句中声明多个变量:
var i, j, k int // int, int, int
var b, f, s = true, 2.3, "four" // bool, float64, string
包内可见的变量在main函数开始执行之前初始化,本地变量在函数执行到对应的声明语句时初始化。
变量也可以通过函数的返回值来初始化:
var f, err = os.Open(name) // os.Open returns a file and an error
1.2 短声明
在函数内部,有一种短声明的方式,形式是name := expression,这里,变量的类型是由编译器自动确定的。
anim := gif.GIF{LoopCount: nframes}
freq := rand.Float64() * 3.0
t := 0.0
因为这种形式非常简洁,因此在函数内部(本地变量)大量使用。如果需要为本地变量显式的指定类型,或者先声明一个变量后面再赋值,那么应该使用var:
i := 100 // an int
var boiling float64 = 100 // a float64
var names []string
var err error
var p Point
就像var声明一样,短声明也可以并行初始化
i, j := 0, 1
要谨记的是,:=是一个声明,=是一个赋值,因此在需要赋值的场所不能使用 :=
var i int
i := 10//panic : no new variables on left side of :=
可以利用并行赋值的特性来进行值交换:
i, j = j, i // swap values of i and j
有一点需要注意的:短声明左边的变量未必都是新声明的!
in, err := os.Open(path1) //新声明两个变量:in, err
//...
out, err := os.Create(path2)
/*因为err已经声明过,因此这里只新声明一个变量out。
虽然这里使用:=,但是err是在上个语句声明的,这里仅仅是赋值*/
而且,短声明的左边变量必须有一个是新的,若都是之前声明过的,会报编译错误:
f, err := os.Open(infile)
// ...
f, err := os.Create(outfile) // compile error: no new variables
正确的写法是这样的:
f, err := os.Open(infile)
// ...
f, err = os.Create(outfile) // compile ok
1.3 指针
- f, err := os.Open(infile)
- // ...
- f, err = os.Create(outfile) // compile ok