首页 > 解决方案 > 更改指向 *os.File 的指针

问题描述

我已旋转文件,我需要定期更改文件,但我无法更新指向文件的指针

var (
  file          *os.File
)

func init() {
    file, err = os.Create(fileName)
}

func main() {
  ticker = time.NewTicker(time.Second * 6)
  defer ticker.Stop()

  go func(file *os.File) {
      <- ticker.C
      fn := fmt.Sprintf("%d%s", time.Now().Unix(), ".txt")
      file, _ = os.Create(fn)
  }(file)

  http.HandleFunc("/go", goHandler)
}

func goHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Printf("hand File: %v\n", *file)
  // when handler triggered file stay the same
  file.WriteString(myPayload)
}

它在 goroutines 内部发生变化,但它不会在处理程序中做出反应,因此文件始终保持不变。

建议,请,我如何将指针更改为*os.File

标签: go

解决方案


在您的代码中,goroutine 只运行一次。所以它创建了一个新文件并且什么都不做——这意味着*file只改变了一次。

您应该更改<- ticker.Cfor _ = range ticker.C { ... }.

*file此外,您应该注意使用 a更改和读取值sync.Mutex,因为两个 goroutine 之间存在数据竞争。


推荐阅读