我有以下代码
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。我做错了什么?
答案 0 :(得分:2)
问题出在main
。
outputOnly := *vmoutputonlyPtr
:=
在左边的outputOnly
左侧声明了一个新变量 ,*vmoutputonlyPtr
并将表达式赋给它。它相当于......
var outputOnly bool = *vmoutputonlyPtr
这个新的outputOnly
"shadows"您的全局outputOnly
在其范围内。因此outputOnly := *vmoutputonlyPtr
中main
之后的所有代码都指向outputOnly
本地main
。虽然something()
是指全球outputOnly
。
See Redeclaration and Reassignment in Effective Go了解有关Go中变量阴影的更多信息。
如果要分配给现有变量,只需使用=
。
outputOnly = *vmoutputonlyPtr