我正在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/