我搞乱了标志库,发现这段代码不起作用:
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中取消引用函数,还是我做错了什么?
答案 0 :(得分:2)
这是因为当你调用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
包知道您的recursive
变量:您可以告诉flag
包您将结果存储到中的内容您的 recursive
变量是通过flag.BoolVar()
函数告诉它的:
flag.BoolVar(&recursive, "r", false, "Search recursively")
请注意,在这种情况下没有返回值,因为您明确提供了指向bool
的指针,您希望flag
包存储结果。