为了账号安全,请及时绑定邮箱和手机立即绑定

为什么此代码不会在 flag.IntVar 上返回错误?

为什么此代码不会在 flag.IntVar 上返回错误?

Go
红颜莎娜 2021-06-25 14:01:14
我目前正在阅读一本关于 Go 的书,并看到了以下脚本:package mainimport (    "flag"    "fmt"    "log"    "os"    "path/filepath"    "runtime"    "strings")func main() {    runtime.GOMAXPROCS(runtime.NumCPU()) // Use all the machine's cores    log.SetFlags(0)    algorithm,        minSize, maxSize, suffixes, files := handleCommandLine()    if algorithm == 1 {        sink(filterSize(minSize, maxSize, filterSuffixes(suffixes, source(files))))    } else {        channel1 := source(files)        channel2 := filterSuffixes(suffixes, channel1)        channel3 := filterSize(minSize, maxSize, channel2)        sink(channel3)    }}func handleCommandLine() (algorithm int, minSize, maxSize int64,    suffixes, files []string) {    flag.IntVar(&algorithm, "algorithm", 1, "1 or 2")    flag.Int64Var(&minSize, "min", -1,        "minimum file size (-1 means no minimum)")    flag.Int64Var(&maxSize, "max", -1,        "maximum file size (-1 means no maximum)")    var suffixesOpt *string = flag.String("suffixes", "",        "comma-separated list of file suffixes")    flag.Parse()    if algorithm != 1 && algorithm != 2 {        algorithm = 1    }    if minSize > maxSize && maxSize != -1 {        log.Fatalln("minimum size must be < maximum size")    }    suffixes = []string{}    if *suffixesOpt != "" {        suffixes = strings.Split(*suffixesOpt, ",")    }    files = flag.Args()    return algorithm, minSize, maxSize, suffixes, files}我只粘贴了相关部分,因为这里粘贴太长了。如果需要更多部分或整个部分,我会立即添加。在上面的代码中,为什么该行flag.IntVar(&algorithm, "algorithm", 1, "1 or 2")没有返回错误?据我所知,当您使用 时flag.IntVar,您必须algorithm在调用函数之前首先定义一个指定为其第一个参数的变量(在这种情况下) - 否则它会返回一个未定义的错误。如果你写出以下代码:package mainimport "flag"func main() {    flag.IntVar(&a, "a", 0, "test")}如果你执行它,你会得到错误undefined: a。所以我想知道为什么第一个代码(由本书作者编写并且我实际上尝试运行)没有返回错误,而第二个却返回错误。供您参考,没有预定义的变量或常量init(),脚本中也没有函数。我还在handleCommandLine()调用函数之前检查了这两个函数main()(即runtime.GOMAXPROCS(runtime.NumCPU())和log.SetFlags(0)),但我很确定前者甚至与这个问题无关。而且我没有在关于后者的文档中得到它的含义,所以也许它导致了问题?
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

调用函数时会自动创建命名返回值;所以algorithmflag.IntVar()调用之前已经定义了。


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信