簡體   English   中英

習慣用法Go,用於抽象資源分配/取消分配

[英]Idiomatic Go for abstracting resource allocation/deallocation

是否有慣用的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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM