2013-08-29 78 views
-1

目前,我正在读一本书去,看到下面的脚本:为什么此代码不会在flag.IntVar上返回错误?

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))之前检查了两个函数,但我很确定前者在这个问题上甚至没有相关性。我没有得到关于后者的文件意味着什么,所以也许这是造成这个问题的原因?

回答

3

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

+0

太棒了。我只注意到我的代码片断可能由于最大长度限制而被切掉。但正如你所解释的,实际的代码返回了命名值。谢谢。 – Blaszard

相关问题