error-handling - 用于抽象资源分配/解除分配的惯用 Go

标签 error-handling go resources idioms

是否有一种惯用的 Go 方法来抽象资源分配/解除分配?我最初的猜测是在高阶函数中抽象分配/解除分配:

func withResource(f func(Resource)error) error {
    // allocate resource
    // defer free resource
    return f(resource)
}

但是,这种思路直接借鉴了函数式范式,似乎与 Go 的命令式本质不太吻合。

作为一个具体示例,在代码块的持续时间内运行守护进程是我当前项目中反复出现的主题,因此我创建了一个 withDaemon 函数来抽象通用性:

func withDaemon(
    cmd *exec.Cmd,
    f func(io.ReadCloser, io.ReadCloser, io.WriteCloser) error,
) error {
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        return fmt.Errorf("couldn't get stdout: %v", err)
    }

    stderr, err := cmd.StdoutPipe()
    if err != nil {
        return fmt.Errorf("couldn't get stderr: %v", err)
    }

    stdin, err := cmd.StdinPipe()
    if err != nil {
        return fmt.Errorf("couldn't get stdin: %v", err)
    }

    if err := cmd.Start(); err != nil {
        return fmt.Errorf("failed to start: %v", err)
    }

    defer func() {
        cmd.Process.Kill()
        cmd.Wait()
    }

    return f(stdout, stderr, stdin)
}

最佳答案

我认为惯用的方法是创建一个 Daemon 类型,并在调用者中使用 defer:

d := NewDaemon(...)
defer d.Stop()
doWhatever()

关于error-handling - 用于抽象资源分配/解除分配的惯用 Go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30277927/

相关文章:

rest - 如果请求的字段不存在,则正确的REST响应

go - path.Match 和 filepath.Match 有什么区别?

csv - 处理上传的 csv 文件

Java,显示从jar中的资源加载的chm文件

ios - UIWebView从远程html引用本地资源

javascript - Ng-Repeat 在资源查询后不更新 - $apply() 不起作用

javascript - Express中的错误处理

c# - 从 Windows 桌面应用程序发送电子邮件错误报告

php - 自定义错误处理程序不处理严重错误(php)

Golang - 从 YearDay int32 中查找月份和日期