是否有一种惯用的 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()
- 1 回答
- 0 关注
- 157 浏览
添加回答
举报
0/150
提交
取消