我编写了以下代码以便可以运行,直到有人手动退出程序为止。
确实是
-----每1秒检查一次是否存在
-----如果可用,则读取文件并逐行打印文件内容
为此,我首先从主调用 然后我调用一个等待组,然后从那里再次调用一个函数来完成上述任务。
请检查我是否在GO上以新手身份正确编写了源代码
此操作仅运行一次并停止...我想让它保持活动状态,看看文件是否存在
请帮助我
package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"os"
"sync"
"time"
)
func main() {
mainfunction()
}
//------------------------------------------------------------------
func mainfunction() {
var wg sync.WaitGroup
wg.Add(1)
go filecheck(&wg)
wg.Wait()
fmt.Printf("Program finished \n")
}
func filecheck(wg *sync.WaitGroup) {
for range time.Tick(time.Second * 1) {
fmt.Println("Foo")
var wgi sync.WaitGroup
wgi.Add(1)
oldName := "test.csv"
newName := "testi.csv"
if _, err := os.Stat(oldName); os.IsNotExist(err) {
fmt.Printf("Path does not exsist \n")
} else {
os.Rename(oldName, newName)
if err != nil {
log.Fatal(err)
}
looping(newName, &wgi)
}
fmt.Printf("Test complete \n")
wgi.Wait()
wg.Done()
time.Sleep(time.Second * 5)
}
}
func looping(newName string, wgi *sync.WaitGroup) {
file, _ := os.Open(newName)
r := csv.NewReader(file)
for {
record, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
var Date = record[0]
var Agent = record[1]
var Srcip = record[2]
var Level = record[3]
fmt.Printf("Data: %s Agent: %s Srcip: %s Level: %s\n", Date, Agent, Srcip, Level)
}
fmt.Printf("Test complete 2 \n")
wgi.Done()
fmt.Printf("for ended")
}
答案 0 :(得分:2)
简短的答案是您可以在循环中找到它:
wg.Done()
一旦文件被读取一次,就会使主goroutine继续退出。
更长的答案是您在这里没有正确使用等待组,恕我直言。例如但绝对没有点在传递一个WaitGroup
{成{1}}。
尚不清楚您的代码试图完成什么-您当然不需要任何goroutine来执行您指定的任务-无需并发即可简化所有代码。