为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 取消引用函数返回值

Golang 取消引用函数返回值

Go
12345678_0001 2021-09-10 20:49:09
我弄乱了标志库,发现这段代码不起作用: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包将结果存储到该指针。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信