为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
人到中年有点甜 2022-01-04 18:48:01
我正在尝试使用文件而不是数据库来启动和运行原型。我有一个程序,它 (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()}
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

服务器无法访问defer writeDB().

http.ListenAndServe 阻塞,如果它确实返回了任何东西,你就会记录它。它会在那个时候退出你的应用程序。

您无法拦截应用程序退出、获取 SIGKILL、机器断电等的所有方式。

我假设你真的只想写一些代码,反弹服务器,重复

如果是这样,那么 Ctrl-C 就足够了。

如果要在 Ctrl-C 上编写文件,请查看信号包。

此外,在函数的最后一行 defer 真的没有任何意义,因为 defer 基本上意味着“最后做这件事”。


查看完整回答
反对 回复 2022-01-04
?
互换的青春

TA贡献1797条经验 获得超6个赞

您可以使用(*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()


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号