gpt4 book ai didi

go - 理解 Go 的 exec.Output() 函数

转载 作者:行者123 更新时间:2023-12-01 21:22:29 24 4
gpt4 key购买 nike

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

// 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 末尾的范围内 block ,并且由于 if 的主体 block 只是设置 Stderr这个实例的字段,唯一有用的方法是通过副作用(比如实际编写美化错误)。不过,我并没有立即理解这是如何发生的。

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

最佳答案

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

如果 err*ExitError 类型,然后 ee将是指向存储在 err 中的 ExitError 的指针.所以,即使 ee将超出范围, *ExitError err 所指向的仍将在那里,并且对其进行的任何更改都将保留。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com