怎么在程序退出的时候做一些事

wangxufire · 2015-11-19 13:58:12 · 2955 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2015-11-19 13:58:12 的主题,其中的信息可能已经有所发展或是发生改变。

在一个方法中打开了一个文件,但是这个方法调用完之后不能关闭这个文件,不能用defer,怎么在程序退出时关闭


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2955 次点击  ∙  1 赞  
加入收藏 微博
4 回复  |  直到 2015-11-23 02:25:56
stevewang
stevewang · #1 · 9年之前

在main函数的defer里关闭文件就可以。

package main

import(
    "os"
    "sync"
    "time"
)

var (
    myFile *os.File
    myLock sync.Mutex
)

func Open(file string) error {
    myLock.Lock()
    defer myLock.Unlock()
    f, err := os.Open(file)
    if err != nil {
        return err
    }
    myFile = f
    return nil
}

func main() {
    defer func() {
        myLock.Lock()
        defer myLock.Unlock()
        if myFile != nil {
            myFile.Close()
            myFile = nil
        }
    }()
    time.Sleep(time.Second * 3)
}
liuxinming
liuxinming · #2 · 9年之前

楼上正解,defer可以帮你搞定的。

wangxufire
wangxufire · #3 · 9年之前

这时要正常退出猜行的吧

TomShine
TomShine · #4 · 9年之前
  • 正常退出使用defer
  • 异常退出使用recover
  • 外部关掉程序,可以先捕获这个信号,然后做自己的一些操作
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传