如何在 Go 中验证文件是否包含要从 ioutil.ReadFile 编组的内容

我正在尝试使用文件而不是数据库来启动和运行原型。我有一个程序,它 (1) 将现有内容从文件读取到地图,(2) 获取将内容添加到地图的 JSON POST,(3) 在退出时写入文件。


首先,文件没有被创建。然后我创建了一个空文件。它没有被写入。我正在尝试读取文件,确定是否存在现有内容。如果没有现有内容,请创建一个空白地图。如果存在现有内容,请将其解组到新地图中。


  func writeDB() {

    eventDBJSON, err := json.Marshal(eventDB)

    if err != nil {

        panic(err)

    }


    err2 := ioutil.WriteFile("/Users/sarah/go/dat.txt", eventDBJSON, 0777)

    if err2 != nil {

        panic(err2)

    }

}


func main() {


    dat, err := ioutil.ReadFile("/Users/sarah/go/dat.txt")

    if err != nil {

        panic(err)

    }

    if dat == nil {

        eventDB = DB{

            events: map[string]event{},

        }

    } else {

        if err2 := json.Unmarshal(dat, &eventDB); err2 != nil {

            panic(err2)

        }

    }


    router := httprouter.New()

    router.POST("/join", JoinEvent)

    router.POST("/create", CreateEvent)


    log.Fatal(http.ListenAndServe(":8080", router))


    defer writeDB()


}


人到中年有点甜
浏览 174回答 2
2回答

胡子哥哥

服务器无法访问defer writeDB().http.ListenAndServe 阻塞,如果它确实返回了任何东西,你就会记录它。它会在那个时候退出你的应用程序。您无法拦截应用程序退出、获取 SIGKILL、机器断电等的所有方式。我假设你真的只想写一些代码,反弹服务器,重复如果是这样,那么 Ctrl-C 就足够了。如果要在 Ctrl-C 上编写文件,请查看信号包。此外,在函数的最后一行 defer 真的没有任何意义,因为 defer 基本上意味着“最后做这件事”。

互换的青春

您可以使用(*os.File).Stat()来获取包含其大小的文件的FileInfo   file, err := os.Open( filepath )     if err != nil {        // handle error    }    fi, err := file.Stat()    if err != nil {      // handle error    }   s := fi.Size()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go