我是新手,发现错误处理非常冗长。我已经读过它的理由并大体上同意,但是似乎在某些地方似乎有更多代码来处理错误而不是实际工作。这是一个(人为的)示例,我在其中传送“ Hello world!”。进入cat并读取并打印输出。基本上,每一行都可以再处理三个错误,而我什至没有处理任何事情。
package main import "fmt" import "io" import "io/ioutil" import "os/exec" func main() { cmd := exec.Command("cat", "-") stdin, err := cmd.StdinPipe() if err != nil { return } stdout, err := cmd.StdoutPipe() if err != nil { return } err = cmd.Start() if err != nil { return } _, err = io.WriteString(stdin, "Hello world!") if err != nil { return } err = stdin.Close(); if err != nil { return } output, err := ioutil.ReadAll(stdout) if err != nil { return } fmt.Println(string(output)) return }
有没有惯用的,干净的方法来处理此问题?我只是觉得我在想什么。
显然,我们必须处理任何错误。我们不能仅仅忽略它们。
例如,为了使示例更不虚假,
package main import ( "fmt" "io" "io/ioutil" "os" "os/exec" ) func piping(input string) (string, error) { cmd := exec.Command("cat", "-") stdin, err := cmd.StdinPipe() if err != nil { return "", err } stdout, err := cmd.StdoutPipe() if err != nil { return "", err } err = cmd.Start() if err != nil { return "", err } _, err = io.WriteString(stdin, input) if err != nil { return "", err } err = stdin.Close() if err != nil { return "", err } all, err := ioutil.ReadAll(stdout) output := string(all) if err != nil { return output, err } return output, nil } func main() { in := "Hello world!" fmt.Println(in) out, err := piping(in) if err != nil { fmt.Println(err) os.Exit(1) } fmt.Println(out) }
输出:
Hello world! Hello world!
错误处理和执行 在Go中,错误处理很重要。该语言的设计和约定鼓励您明确检查错误发生的位置(与其他语言中抛出异常并有时捕获它们的约定不同)。在某些情况下,这会使Go代码变得冗长。
错误处理和执行
在Go中,错误处理很重要。该语言的设计和约定鼓励您明确检查错误发生的位置(与其他语言中抛出异常并有时捕获它们的约定不同)。在某些情况下,这会使Go代码变得冗长。