了解Go的exec.Output()函数

时间:2019-12-06 21:39:48

标签: go

我正在阅读Go的Output()模块(https://golang.org/pkg/os/exec/#Cmd.Output)中Cmd类型的exec方法的源代码:

// Output runs the command and returns its standard output.
// Any returned error will usually be of type *ExitError.
// If c.Stderr was nil, Output populates ExitError.Stderr.
func (c *Cmd) Output() ([]byte, error) {
    if c.Stdout != nil {
        return nil, errors.New("exec: Stdout already set")
    }
    var stdout bytes.Buffer
    c.Stdout = &stdout

    captureErr := c.Stderr == nil
    if captureErr {
        c.Stderr = &prefixSuffixSaver{N: 32 << 10}
    }

    err := c.Run()
    if err != nil && captureErr {
        if ee, ok := err.(*ExitError); ok {
            ee.Stderr = c.Stderr.(*prefixSuffixSaver).Bytes()
        }
    }
    return stdout.Bytes(), err
}

我很难理解这一部分:

    if ee, ok := err.(*ExitError); ok {
        ee.Stderr = c.Stderr.(*prefixSuffixSaver).Bytes()
    }

据我了解,ee指针将不再位于if块末尾的范围内,并且由于if块的主体仅设置了{在此实例的{1}}字段中,此方法唯一有用的方法是产生副作用(例如实际编写预设的错误)。不过,我不立即了解这种情况。

这段代码本质上是做什么的?

1 个答案:

答案 0 :(得分:3)

if ee, ok := err.(*ExitError); ok {

如果err的类型为*ExitError,则ee将是指向存储在err中的ExitError的指针。因此,即使ee超出范围,*ExitError仍然指向err,并且对其所做的任何更改都会保留。