golang进阶四:关于赋值

549 阅读1分钟

短变量声明赋值

包内全局变量时不能使用 :=

当多值赋值时,无论变量是否声明,都可以通过编译

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