猜猜这段代码会输出什么?
package main
import "fmt"
func f(x int) (int, error) {
return x+1, nil
}
func main() {
a := 1
b := 2
// var err error
if b > 1 {
a, err := f(a)
fmt.Println("Hello, World!", a, err) // 输出:Hello, World! 2 <nil>
}
fmt.Println("Hello, World!", a, b) // 输出:Hello, World! 1 2
}
import "fmt"
func f(x int) (int, error) {
return x+1, nil
}
func main() {
a := 1
b := 2
// var err error
if b > 1 {
a, err := f(a)
fmt.Println("Hello, World!", a, err) // 输出:Hello, World! 2 <nil>
}
fmt.Println("Hello, World!", a, b) // 输出:Hello, World! 1 2
}
是不是觉得很坑,a明明是局部变量,在if{}中使用的:=赋值居然不成功,据说if中的a跟外面的a地址不一样,应该是golang的变量作用域的问题,判定两个a是两个作用域,导致了这种奇怪的现象,不知道会不会修复
那如何才能避免呢:
package main
import "fmt"
func f(x int) (int, error) {
return x+1, nil
}
func main() {
a := 1
b := 2
var err error //变量都在外面定义
if b > 1 {
a, err = f(a) //这里避免使用 := 赋值
fmt.Println("Hello, World!", a, err) // 输出:Hello, World! 2 <nil>
}
fmt.Println("Hello, World!", a, b) // 输出:Hello, World! 2 2
}
import "fmt"
func f(x int) (int, error) {
return x+1, nil
}
func main() {
a := 1
b := 2
var err error //变量都在外面定义
if b > 1 {
a, err = f(a) //这里避免使用 := 赋值
fmt.Println("Hello, World!", a, err) // 输出:Hello, World! 2 <nil>
}
fmt.Println("Hello, World!", a, b) // 输出:Hello, World! 2 2
}
转载请注明:小Y » golang变量使用中的一个小坑