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

是否有一种惯用的 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)

}


UYOU
浏览 158回答 1
1回答

繁星coding

我认为惯用的方法是创建一个守护进程类型,并在调用者中使用 defer:d := NewDaemon(...)defer d.Stop()doWhatever()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go