Golang 取消引用函数返回值

我弄乱了标志库,发现这段代码不起作用:


package main


import (

    "fmt"

    "flag"

)


var recursive bool


func init() {

    recursive = *flag.Bool("r", false, "Search recursively")

}

func main() {

    flag.Parse()


    fmt.Printf("Recursive: %t \n\n", recursive)


    flag.PrintDefaults()


}

但这确实(我评论了我更改的三行):


package main


import (

    "fmt"

    "flag"

)


var recursive *bool   //Changed to pointer type


func 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 中取消引用函数,还是我做错了什么?


12345678_0001
浏览 259回答 1
1回答

慕码人8056858

这样做的原因是因为当您调用 时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包将结果存储到该指针。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go