我正在尝试使用文件而不是数据库来启动并运行原型。我有一个程序,(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()
}
答案 0 :(得分:1)
服务器无法覆盖defer writeDB()
。
http.ListenAndServe阻止,如果它确实返回了任何内容,那么你log.Fatal会在那时退出你的app。
你不能拦截应用程序可以退出的所有方式,获取SIGKILL,机器断电等等。
我假设你真的只想写一些代码,反弹服务器,重复
如果是这种情况,那么Ctrl-C就足够了。
如果您想在Ctrl-C上编写文件,请查看signal包。
另外,推迟函数的最后一行实际上没有任何目的,因为延迟基本上意味着“做最后一次”。
答案 1 :(得分:0)
您可以使用(*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()