如何检查Go语言中int类型指针flag是否已设置?
如何检查指针类型int flag是否已设置?
你的代码报错是因为verbose是*int类型的指针,不能直接和int常量0比较,二者类型不兼容。另外还有关键问题:你没有调用flag.Parse(),命令行参数不会被解析,flag永远处于默认状态。
以下是两种可行的解决方案:
方法一:准确判断flag是否被显式设置(推荐)
使用flag.Visit()遍历所有被用户显式设置的flag,判断目标flag是否在其中。这种方法不受默认值和用户输入值是否相同的影响,是最可靠的方式:
package main import ( "flag" "log" ) var verbose *int func main() { verbose = flag.Int("v", 0, "verbosity") flag.Parse() // 必须先解析命令行参数 var verboseSet bool // 遍历所有被显式设置的flag flag.Visit(func(f *flag.Flag) { if f.Name == "v" { verboseSet = true } }) if verboseSet { log.Printf("Verbose flag已设置,值为: %d", *verbose) } else { log.Print("Verbose flag未设置,使用默认值") } }
方法二:通过值判断(有局限性)
如果可以确保用户设置的值不会和默认值相同,也可以直接比较指针指向的值和默认值:
package main import ( "flag" "log" ) const defaultVerbosity = 0 var verbose *int func main() { verbose = flag.Int("v", defaultVerbosity, "verbosity") flag.Parse() if *verbose != defaultVerbosity { log.Printf("Verbose模式已启用,级别: %d", *verbose) } }
注意:如果用户显式设置了和默认值相同的值(比如./program -v 0),这种方法会误判为未设置,所以仅在默认值和合法输入值无交集时使用。
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

