我弄乱了标志库,发现这段代码不起作用:package mainimport ( "fmt" "flag")var recursive boolfunc init() { recursive = *flag.Bool("r", false, "Search recursively")}func main() { flag.Parse() fmt.Printf("Recursive: %t \n\n", recursive) flag.PrintDefaults()}但这确实(我评论了我更改的三行):package mainimport ( "fmt" "flag")var recursive *bool //Changed to pointer typefunc init() { recursive = flag.Bool("r", false, "Search recursively") //Changed to not dereference function}func main() { flag.Parse() fmt.Printf("Recursive: %t \n\n", *recursive) //Changed to dereference variable flag.PrintDefaults()}为什么会有这样的行为?不允许在 Golang 中取消引用函数,还是我做错了什么?
1 回答
慕码人8056858
TA贡献1803条经验 获得超6个赞
这样做的原因是因为当您调用 时flag.Bool()
,它尚未解析命令行参数,它只是定义了一个命名标志并使用默认值(即false
您指定的值)对其进行初始化。
命令行参数仅在您调用flag.Parse()
. 如果您使用recursive bool
,则在init()
函数false
中将为其分配默认值。该flag
包不知道你的recursive
变量,所以以后当你调用flag.Parse()
,它的值不会/不能改变。
flag.Bool()
返回一个指向包知道的bool
变量的指针flag
,稍后当您调用flag.Parse()
指向的bool
变量时将正确更新,因此当您打印指向后flag.Bool()
的值时,它将是更新的值,该值将根据您的命令行参数设置.
替代方案:注册您的变量
所以你必须存储和使用flag.Bool()
else返回的指针,你只会看到默认值。或者你可以让flag
包知道你的recursive
变量:你可以告诉flag
包你将结果存储到你的 recursive
变量中,方法是用flag.BoolVar()
函数告诉它:
flag.BoolVar(&recursive, "r", false, "Search recursively")
请注意,在这种情况下没有返回值,因为您明确提供了一个指向 a 的指针bool
,您希望flag
包将结果存储到该指针。
- 1 回答
- 0 关注
- 258 浏览
添加回答
举报
0/150
提交
取消