Golang 取消引用函数 return 值

Golang derefencing function return value

我在搞flag库,发现这段代码不行:

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

这是因为当你调用flag.Bool()时,它还没有解析命令行参数,它只是定义了一个命名标志并用默认值(即false 如您指定的那样)。

仅当您调用 flag.Parse() 时才会解析命令行参数。如果您使用 recursive bool,在 init() 函数中默认的 false 将被分配给它。 flag 包不知道你的 recursive 变量,所以稍后当你调用 flag.Parse() 时,它的值不会/不能改变。

flag.Bool() returns 指向 flag 包知道的 bool 变量的指针,稍后当您调用 flag.Parse() 时,指向的 bool 变量将被正确更新,因此当您在 flag.Bool() 之后打印指向的值时,它将是根据您的命令行参数设置的更新值。

备选方案:注册您的变量

因此您必须存储和使用由flag.Bool()编辑的指针return,否则您将只能看到默认值。 或者 你可以让 flag 包知道你的 recursive 变量:你可以告诉 flag 包你把结果存储到什么地方你的 recursive 变量通过 flag.BoolVar() 函数告诉它:

flag.BoolVar(&recursive, "r", false, "Search recursively")

请注意,在这种情况下没有 return 值,因为您明确提供了指向 bool 的指针,您希望 flag 包将结果存储到该指针。