Go 语言的变量shadowing的作用是什么呢?如何检测 shadowing 变量?

题目描述

package main

import (
    "fmt"
)

func main() {
    x := 0

    fmt.Println("Before the decision block, x:", x)

    if true {
        x := 1
        x++
    }

    fmt.Println("After the decision block, x:", x)
}

image.png

在上面的程序中,语句 x :=1 声明了一个新的变量,它在整个 if 语句的范围内对原来的 x 进行影射。因此,在 if 语句中声明的这个变量 x 被称为变量 shadowing 。

相关代码

如果我们想重用外部块中的实际变量 x,那么在 if 语句中,改为写入 x = 1。

package main

import (
    "fmt"
)

func main() {
    x := 0

    fmt.Println("Before the decision block, x:", x)

    if true {
        // x := 1
        x = 1
        x++
    }

    fmt.Println("After the decision block, x:", x)
}

image.png

问题是:这样的 shadowing 变量有什么作用呢?如何检测这样的变量是否在代码中存在?

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
阅读 1.3k
1 个回答

除了反直觉给你造成困扰外没有任何作用,这只是在无数语言中都存在的同名变量作用域问题,同一个变量名在不同的作用域中分别被创建,导致他们看起来是同一个其实不是同一个,你把这个看成调用函数后生成了一个同名变量就行了。

如何检测,对于1.12后的版本,要下载shadow包。然后在有代码文件的目录内执行下面第二条命令。

go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
go vet -vettool=$(which shadow)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题