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

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

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

Go
UYOU 2021-10-04 18:17:12
是否有一种惯用的 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)}
查看完整描述

1 回答

?
繁星coding

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

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


d := NewDaemon(...)

defer d.Stop()

doWhatever()


查看完整回答
反对 回复 2021-10-04
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信