英文:
golang issue with reusing variable outside of if/for loops
问题
我刚刚阅读了你提供的代码,并理解你的问题。你遇到的问题是在代码中如何正确地使用bufio
和flag
包来创建日志文件。你希望在指定条件下创建日志文件,并将输出写入该文件。
根据你的代码,我注意到你在if
语句块内部创建了文件f
,但是在if
语句块之外的地方尝试访问它。这导致了w
无法访问f
的问题。为了解决这个问题,你可以在if
语句块内部声明w
变量,并将其作为条件分支之外的变量进行声明。这样,w
将在整个main
函数中都是可访问的。
下面是修改后的代码:
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"
var w *bufio.Writer // 声明 w 变量
if *logFile == "yes" {
f, err := os.Create(name)
if err != nil {
panic(err)
}
defer f.Close()
w = bufio.NewWriter(f) // 在 if 语句块内部初始化 w
} else {
w = bufio.NewWriter(os.Stdout) // 在 else 分支内部初始化 w
}
for _, v := range my_slice {
switch {
case *logFile == "yes":
fmt.Fprintln(w, v)
case *logFile != "yes":
fmt.Println(v)
}
}
w.Flush()
}
这样修改后,你应该能够在满足条件时创建日志文件,并将输出写入该文件。如果条件不满足,则将输出打印到标准输出。希望这可以解决你的问题!如果还有其他疑问,请随时提问。
英文:
I am new to Go and have been working through different issues I am having with the code I am trying to write. One problem though has me scratching my head. I have been searching net but so far did not find a way to solve this.
As you will see in the below code, I am using flag
to specify whether to create log file or not. The problem I am running into is that if I put w := bufio.NewWriter(f)
inside the if
loop then w
is inaccessible from the following for
loop. If I leave it outside of the if
loop then buffio
cannot access f
.
I know I am missing something dead simple, but I am at a loss at this moment.
Does anyone have any suggestions?
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
得分: 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()
这段代码的作用是将mySlice
中的元素逐行写入到标准输出或者文件中(如果logFile
为"yes")。bufio.NewWriter
用于创建一个带缓冲的写入器,fmt.Fprintln
用于将内容写入到写入器中,w.Flush()
用于将缓冲区中的内容刷新到底层的io.Writer
中。
英文:
os.Stdout
is an io.Writer
too, so you can simplify your code to
w := bufio.NewWriter(os.Stdout)
if *logFile == "yes" {
// ...
w = bufio.NewWriter(f)
}
for _, v := range mySlice {
fmt.Fprintln(w, v)
}
w.Flush()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论