golang变量使用中的一个小坑

猜猜这段代码会输出什么?

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
}

是不是觉得很坑,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
}

转载请注明:小Y » golang变量使用中的一个小坑

赞 (34) 评论 (0) 分享 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址