私は現在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
。だから、本の著者が書いて実際に実行しようとした最初のコードが、2番目のコードがエラーを返さないのはなぜかと思います。参考までに、事前定義された変数や定数はなくinit()
、スクリプトには関数がありません。またhandleCommandLine()
、main()
関数を呼び出す前に2つの関数(つまりruntime.GOMAXPROCS(runtime.NumCPU())
とlog.SetFlags(0)
)をチェックアウトしましたが、前者がこの問題に関係していないことは確かです。そして、後者に関してドキュメントでそれが何を意味するのか理解できなかったので、それが問題を引き起こしているのでしょうか?
名前付きの戻り値は、関数が呼び出されると自動的に作成されます。そのalgorithm
前にすでに定義されてflag.IntVar()
呼ばれています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加