刷题中碰见的Golang语言问题

一些已知的情况

在Golang语言中,一个变量赋值/使用前,需要声明变量的类型。例如:

var a int
a = 10
fmt.Printf("%d\n", a)

使用另一种形式:=也可以对变量进行隐式的声明。例如:

a := 10
fmt.Printf("%d\", a)

对于一个变量,可以赋值多次,但是只能声明一次,不能重复。例如:

a := 10
a := 100
b := 10
b := "10"

这些重复声明都会报错:

Line 5: Char 10: no new variables on left side of :=

但是如果有多个变量在:=左侧的话,那么只要有一个变量还没有声明,这个语法就是正确的,下面的例子特别常见:

a, err := foo()
b, err := bar()

还有一种情况是作用域不同也是可以重复声明的。例如:

a := 1
fmt.Printf("%d\n", a)
if ... {
  a := 2
  fmt.Printf("%d\n", a)
}
fmt.Printf("%d\n", a)

这里,应该输出:

1
2
1

奇怪的情况

把上面几种情况组合一下:

a := 1
fmt.Printf("%d\n", a)
if ... {
  a = 12
  fmt.Printf("%d\n", a)
  a, b := 2, 3
  fmt.Printf("%d\n", a)
  a = 13
  fmt.Printf("%d\n", a)
}
fmt.Printf("%d\n", a)

这里输出的是:

1
12
2
13
12

这里竟然a是会被重新声明!,因此可以看出:=的意义,只要左侧变量可以被声明,那么就尽量让左侧变量声明。上面例子的写法其实非常的容易写错,解决的办法是提前声明b

posted @ 2022-01-12 19:14  WangZhuo2000  阅读(54)  评论(0编辑  收藏  举报