我正在尝试使用文件而不是DB来启动和运行原型。我有一个程序,它(1)将现有内容从文件读取到映射中,(2)获取将内容添加到映射中的JSON POSTs,(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()
}发布于 2016-04-18 09:59:04
服务器永远不可能到达defer writeDB()。
http.ListenAndServe块,如果它确实返回了任何东西,您可以log.Fatal它,这将在此时退出您的应用程序。
你不能拦截应用程序退出的所有方式,比如SIGKILL、机器断电等。
我假设你真的只想写一些代码,跳过服务器,重复
如果是这样,那么Ctrl-C就足够好了。
如果您想要在Ctrl-C上编写文件,请查看signal包。
此外,在函数的最后一行延迟实际上没有任何意义,因为延迟基本上意味着“最后做这件事”。
发布于 2016-04-18 09:25:43
您可以使用(*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()https://stackoverflow.com/questions/36684061
复制相似问题