是否有一種慣用的 Go 方法來抽象資源分配/解除分配?我最初的猜測是在高階函數(shù)中抽象分配/解除分配:func withResource(f func(Resource)error) error { // allocate resource // defer free resource return f(resource)}然而,這種思路是直接從函數(shù)范式中借來的,似乎與 Go 的命令式本質(zhì)不太吻合。作為一個具體的例子,在代碼塊的持續(xù)時間內(nèi)運行守護程序是我當(dāng)前項目中反復(fù)出現(xiàn)的主題,因此我創(chuàng)建了一個withDaemon函數(shù)來抽象共性: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條經(jīng)驗 獲得超4個贊
我認為慣用的方法是創(chuàng)建一個守護進程類型,并在調(diào)用者中使用 defer:
d := NewDaemon(...)
defer d.Stop()
doWhatever()
- 1 回答
- 0 關(guān)注
- 187 瀏覽
添加回答
舉報
0/150
提交
取消