我正在阅读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}}字段中,此方法唯一有用的方法是产生副作用(例如实际编写预设的错误)。不过,我不立即了解这种情况。
这段代码本质上是做什么的?
答案 0 :(得分:3)
if ee, ok := err.(*ExitError); ok {
如果err
的类型为*ExitError
,则ee
将是指向存储在err
中的ExitError的指针。因此,即使ee
超出范围,*ExitError
仍然指向err
,并且对其所做的任何更改都会保留。