在if / for循环之外重用变量的golang问题

时间:2015-12-09 17:53:23

标签: go

我是Go的新手,并且一直在解决我正在尝试编写的代码所遇到的各种问题。但是有一个问题让我摸不着头脑。我一直在寻找网,但到目前为止还没有办法解决这个问题。

正如您将在下面的代码中看到的那样,我使用flag来指定是否创建日志文件。我遇到的问题是,如果我将w := bufio.NewWriter(f)置于if循环内,则w循环无法访问for。如果我将其留在if循环之外,则buffio无法访问f

我知道我错过了一些简单的东西,但此刻我感到很茫然。

有人有任何建议吗?

package main

import (
    "bufio"
    "flag"
    "fmt"
    "os"
    "time"
    "path/filepath"
    "strconv"
)

var (
    logFile = flag.String("file", "yes", "Save output into file")
    t      = time.Now()
    dir, _ = filepath.Abs(filepath.Dir(os.Args[0]))
)

func main() {
    flag.Parse()

    name := dir + "/" + "output_" + strconv.FormatInt(t.Unix(), 10) + ".log"

    if *logFile == "yes" {
        f, err := os.Create(name)
        if err != nil {
            panic(err)
        }
        defer f.Close()
    }
    w := bufio.NewWriter(f)

    for _, v := range my_slice {
        switch {
        case *logFile == "yes":
            fmt.Fprintln(w, v)
        case *logFile != "yes":
            fmt.Println(v)
        }
    }
    w.Flush()
}

1 个答案:

答案 0 :(得分:1)

os.Stdout也是io.Writer,因此您可以将代码简化为

w := bufio.NewWriter(os.Stdout)
if *logFile == "yes" {
    // ...
    w = bufio.NewWriter(f)
}

for _, v := range mySlice {
        fmt.Fprintln(w, v)
}
w.Flush()