Go 错误处理及Go语言的独特之处

Go 错误处理及Go语言的独特之处,在Go语言中,一种约定是在调用可能出现问题的方法或函数时,返回一个类型为错误的值。这意味着如果出现问题,函数通常不会引发异常,而让调用者决定如何处理错误。如下程序演示了这种约定,其中使用的函数ioutil.Readfile在出现问题时返回一个错误值。

 package main

 import (
  "fmt"
  "io/ioutil"
 )

 func main() {
  file, err := ioutil.ReadFile("foo.txt")
  if err != nil {
   fmt.Println(err)
   return
  }
  fmt.Println("%s", file)
 }

在没有文件foo.txt的系统中运行这个程序时,将触发错误。
Go 错误处理及Go语言的独特之处

这个示例包含的代码不多,却展示了Go语言对错误的众多看法。

  • 使用标准库中io/ioutil包内的函数ReadFile读取文件。
  • 如果有错误,就意味着返回的错误值不为nil。
  • 打印错误,程序就此结束。
  • 如果没有错误,就打印文件的内容。

要理解Go语言处理错误的方式,最重要的是明白函数ReadFile接受一个字符串参数,并返回一个字节切片和一个错误值。这个函数的定义如下。

func ReadFile(filename string) ([]byte, error)

这意味着函数ReadFile总是会返回一个错误值,可对其进行检查。在前述示例的main函数中,将方法ReadFile的返回值存储到了两个变量(file和err)中,这是Go代码中常见的模式,您经常会见到。

file, err := ioutil.ReadFile("foo.txt")

语法:=是Go语言中的简短赋值语句,只能在函数中使用。Go编译器会自动推断出变量的类型,而无须显式地声明,因此这里无须告诉编译器file是一个字节切片,而err是一个错误。这提供了极大的便利,前述代码与下面的代码等价。

var file []byte
var err error
file, err = ioutil.Readfile("foo.txt")

在Go语言中,有一种约定是,如果没有发生错误,返回的错误值将为nil。这让程序员调用方法或函数时,能够检查它是否像预期那样执行完毕。

if err != nil {
// something went wrong
}

在Go程序中,这种做法很常见。有些开发人员认为,这种做法很繁琐,因为它要求调用每个方法或函数时都检查错误,导致代码重复。

这说得也许没错,但Go语言处理错误的方式比其他语言更灵活,因为可像其他类型一样在函数之间传递错误。这通常意味着代码要简短得多。如果您要更深入地了解这一点,可阅读Rob Pike的博文《Errors are Values》。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!