去全球变量不反映正确的价值

时间:2017-12-28 20:52:58

标签: go

我有以下代码

package main

import ( 
    "fmt"
    "flag"
)

var outputOnly bool


func something() string {
    if outputOnly {
        fmt.Println("outputting only")
    } else {
        fmt.Println("executing commands")
    }   
    return "blah"
}

func main() {

    vmoutputonlyPtr     := flag.Bool("outputonly",false,"If set it will only output the commands it would execute, naturally without the correct parameter values set.")
    flag.Parse()
    outputOnly          := *vmoutputonlyPtr 
    if outputOnly {
        fmt.Println("outputonly commands will not execute")
    }

    var blah string
    blah = something()
    fmt.Println("blah is " + blah)
}

但输出是这样的:

$ ./se -outputonly                       
outputonly commands will not execute
executing commands

即。似乎函数something()知道全局变量,但不反映其真实值。这是我第一次尝试golang。我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题出在main

outputOnly := *vmoutputonlyPtr 

:= 在左边的outputOnly左侧声明了一个新变量 *vmoutputonlyPtr并将表达式赋给它。它相当于......

var outputOnly bool = *vmoutputonlyPtr

这个新的outputOnly "shadows"您的全局outputOnly在其范围内。因此outputOnly := *vmoutputonlyPtrmain之后的所有代码都指向outputOnly本地main。虽然something()是指全球outputOnly

See Redeclaration and Reassignment in Effective Go了解有关Go中变量阴影的更多信息。

如果要分配给现有变量,只需使用=

outputOnly = *vmoutputonlyPtr