短变量声明赋值
包内全局变量时不能使用 :=
当多值赋值时,无论变量是否声明,都可以通过编译
var x int
x, y := f() // OK
但如果是结构体变量,不能使用短变量声明赋值
type info struct {
result int
}
func work() (int,error) {
return 13,nil
}
func main() {
var data info
data.result, err := work()
}
// 修复:增加 err 的声明,并使用 = 赋值
多重赋值
多重赋值的计算步骤:1.先计算左边的索引表达式与取值表达式。2.赋值
i := 1
s := []string{"A", "B", "C"}
i, s[i-1] = 2, "Z"
// s: [Z, B, C]
// 1. 计算索引 i-1; 2. 赋值 i = 2; s[0] = "Z"
var s []int
s, s[0] = []int{1, 2}, 9
// error: s为nil s[0]报错
map 赋值
type Math struct {
x, y int
}
var m = map[string]Math{
"foo": Math{2, 3},
}
func main() {
m["foo"].x = 4 // compilation error
fmt.Println(m["foo"].x)
}
// 对于类似 X = Y的赋值操作,必须知道 X 的地址,才能够将 Y 的值赋给 X,
// 但 go 中的 map 的 value 本身是不可寻址的。可修改为:
var m = map[string]*Math {
"foo": &Math{2, 3},
}
// 或者
tmp := m["foo"]
tmp.x = 4
m["foo"] = tmp