Golang derefencing函数返回值

时间:2015-01-13 06:40:50

标签: go

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

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

1 个答案:

答案 0 :(得分:2)

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

仅在调用flag.Parse()时解析命令行参数。如果您使用recursive bool,则会在init()函数中为其分配默认falseflag包不知道您的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包存储结果。