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
包将结果存储到该指针。
我在搞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
包将结果存储到该指针。