变量
变量声明
- 用var声明定义变量以及它的类型和初值:var name type = expression
- 类型或者= expression部分可以省略,但不能两者同时省略。
- 如果类型省略,则编译器根据expression推断类型。
- 如果省略= expression,则该变量初始为0值:
- 数字初始为0
- 布尔值初始为false
- 字符串初始为空
- 接口和引用初始为nil
- 数组和结构体将其中的元素或字段初始为0值
- 一次声明多个变量:
var i, j, k int // int, int, int
var b, f, s = true, 2.3, "four" // bool float64 strin
- 多个变量声明为函数的返回值:
var f, err = os.Open(name) // os.Open returns a file and an error
-
如果声明了一个变量,却没有使用它,则会报错。
简短的变量声明
- 在函数里可以使用简短的变量声明:name := expression,name的类型根据expression推断。
- 初始化多个变量:i, j := 0, 1
- 多个变量声明为函数返回值:
f, err := os.Open(name)
- 多变量声明时不必所有变量都是新创建的变量,但必须至少有一个是新创建的变量。多变量声明中已经创建过的变量视为赋值:
// 假设in,err和out都没有被声明过
in, err := os.Open(infile) // ok, 声明in和err
//...
out, err := os.Create(outfile) // ok, 声明out,给err赋值
// 假设f,err没有被声明过
f, err := os.Open(infile)
//...
f, err := os.Create(outfile) // 编译错误,没有新变量被创建
变量赋值
- 赋值运算符:=
- 任何算数运算符或者位运算符后面接=则组成复合赋值运算符,例如:+=,*=
- 数值变量可以使用自增和自减运算符是自身的值加1或减1。没有前置自增。
v := 1
v++ // same as v = v + 1; v becomes 2
v-- // same as v = v - 1; v becomes 1 again
多重赋值
- 多重赋值允许一次赋值多个变量:
i, j, k = 2, 3, 5
x, y = y, x // 交换两个变量的值
- 若函数或操作符返回多个值,则在赋值左侧必须用多个变量,个数必须与返回值的个数一致:
f, err = os.Open("foo.txt") // function call return two values
- 如果不想用多个函数返回值中的某个或某几个,则可以用_代替:
_, err = io.Copy(dst, src)
隐式赋值
- 隐式赋值发生在函数参数传递,函数返回值等情况。