-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。では、なぜ最初のコード (本の著者によって書かれ、実際に実行しようとした) はエラーを返さないのに、2 番目のコードはエラーを返さないのだろうか。参考までに、定義済みの変数や定数はなくinit()、スクリプトには関数がありません。handleCommandLine()関数の呼び出しの前に 2 つの関数main()(つまりruntime.GOMAXPROCS(runtime.NumCPU())と)もチェックアウトしましたlog.SetFlags(0)が、前者はこの問題に関連していないことは確かです。そして、後者に関するドキュメントでそれが何を意味するのかわからなかったので、問題を引き起こしているのでしょうか?

4

1 に答える 1

4

関数が呼び出されると、名前付きの戻り値が自動的に作成されます。soは呼び出さalgorithmれる前にすでに定義されています。flag.IntVar()

于 2013-08-29T20:54:32.697 に答える