我正在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块的主体只是在设置此实例的Stderr字段,因此唯一有用的方法是通过副作用(例如实际上写出预设的错误)。不过,我不立即了解这种情况。

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

最佳答案

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

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

关于go - 了解Go的exec.Output()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59220666/

10-11 19:49