gpt4 book ai didi

Golang 解引用函数返回值

转载 作者:IT王子 更新时间:2023-10-29 02:05:36 26 4
gpt4 key购买 nike

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

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() 返回一个指向 bool 变量的指针,flag 包知道该变量,稍后当您调用 flag.Parse() 指向的 bool 变量将被正确更新,因此当您在 flag.Bool() 之后打印指向值时,它将是将根据您的命令行参数设置的更新值。

备选方案:注册您的变量

因此您必须存储和使用flag.Bool() 返回的指针,否则您将只能看到默认值。 或者你可以让flag包知道你的递归变量:你可以告诉flag包你是什么它通过使用 flag.BoolVar() 函数将结果存储到您的 递归 变量中:

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

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

关于Golang 解引用函数返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27916268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com