目前,我正在讀一本書去,看到下面的腳本:爲什麼此代碼不會在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)
)之前檢查了兩個函數,但我很確定前者在這個問題上甚至沒有相關性。我沒有得到關於後者的文件意味着什麼,所以也許這是造成這個問題的原因?
太棒了。我只注意到我的代碼片斷可能由於最大長度限制而被切掉。但正如你所解釋的,實際的代碼返回了命名值。謝謝。 – Blaszard