-1

我目前正在阅读一本关于 Go 的书,并看到了以下脚本:

package main

import (
    "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 main
import "flag"
func main() {
    flag.IntVar(&a, "a", 0, "test")
}

如果你执行它,你会得到错误undefined: a。所以我想知道为什么由本书作者编写并且我实际上尝试运行的第一个代码没有返回错误,而第二个代码却返回了错误。供您参考,没有预定义的变量或常量init(),脚本中也没有函数。handleCommandLine()在调用函数之前,我还检查了这两个函数main()(即runtime.GOMAXPROCS(runtime.NumCPU())log.SetFlags(0)),但我很确定前者甚至与这个问题无关。而且我没有得到关于后者在文档中的含义,所以也许它导致了这个问题?

4

1 回答 1

4

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

于 2013-08-29T20:54:32.697 回答