一尘不染

去可变范围和阴影

go

这是来自GOPL的示例-“表达式x [i]和x +’A’-‘a’分别引用外部块中x的声明;我们稍后将对此进行解释。”

解释永远不会到来。为什么x [i]引用外部范围中的x?只要在内部块中重新声明x,它就应该在外部块中遮盖x。为什么这样做?

package main

import "fmt"

func main() {
    x := "hello!"
    for i := 0; i < len(x); i++ {
        x := x[i]
        if x != '!' {
            x := x + 'A' - 'a'
            fmt.Printf("%c", x)
        }
    }
}

http://play.golang.org/p/NQxfkTeGzA


阅读 183

收藏
2020-07-02

共1个答案

一尘不染

:= 运算符创建一个新变量,并为其分配右侧值。

在for循环的第一个迭代中,在步骤中x := x[i],仅x右手边看到的是x在步骤中定义的x := "hello!"。就右侧而言,x尚未重新声明。

一旦在内部块中重新声明x。

目前还没有。仅在之后才重新声明x := x[i]

在迭代结束时,new x的作用域结束。它不会在新的迭代中重用。

当一个新的迭代发生时,同样的事情又重新发生了。

2020-07-02