Fork me on GitHub

Go简短模式声明变量之部分退化赋值

golang 函数内定义变量,推荐使用简短模式,例如:

1
2
x := 1
y := "hello"

由于作用域的关系,该模式容易定义跟全局变量同名的函数局部新变量,使用的时候要特别小心。

1
2
3
4
5
6
7
8
//全局变量x
var x = 100

func main() {
//重新定义和初始化同名的局部变量x
x := "abc"
fmt.Println(x)
}

输出:

1
abc

但是简短模式并不总是定义新变量,在重复使用的时候可能执行的是部分退化赋值操作

部分退化赋值的前提条件:最少有一个新变量被定义,且必须是在同一作用域

1
2
3
4
5
6
7
8
9
10
11
12
package main

import "fmt"

func main() {
x := 100
fmt.Println("x:",x, " &x:",&x)
fmt.Println("========== seperate ========")
x , y := 200 , "abc"
fmt.Println("x:",x, " &x:",&x)
fmt.Println("y:",y, " &y:",&y)
}

输出:

1
2
3
4
x: 100  &x: 0xc00006c080
========== seperate ========
x: 200 &x: 0xc00006c080
y: abc &y: 0xc0000581c0

从输出结果可以看出,前后两次打印的x地址都是同一个,故可以说明前后两次x是同一个变量,仅仅是值发生了变化。

部分退化赋值这一特性可以用在处理函数错误返回值,允许重复使用err变量,非常方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"gocv.io/x/gocv"
"log"
)

func main() {
val1, err := func1()
if err != nil {
log.Fatal(err)
}
...
val2, err := func2()
if err != nil {
log.Fatal(err)
}
}
您的鼓励是我持之以恒的动力