浏览 44
更新于 2020-08-23 08:39
这章中,我们将讨论 Go 功能杂记,放在其他地方都不太合适。
错误处理
Go 首选错误处理方式是返回值,而不是异常。考虑 strconv.Atoi
函数,它将接受一个字符串然后将它转换为一个整数。
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
if len(os.Args) != 2 {
os.Exit(1)
}
n, err := strconv.Atoi(os.Args[1])
if err != nil {
fmt.Println("not a valid number")
} else {
fmt.Println(n)
}
}
你可以创建你自己的错误类型。唯一的要求是你必须实现内建 error
接口的契约:
type error interface {
Error() string
}
更一般地,我们可以通过导入 errors
包然后使用它的 New
函数创建我们自己的错误:
import (
"errors"
)
func process(count int) error {
if count < 1 {
return errors.New("Invalid count")
}
...
return nil
}
Go 标准库中有一个使用 error 变量的通用模式。例如, io
包中有一个 EOF
变量它是这样定义的:
var EOF = errors.New("EOF")
这是一个包级别的变量(被定义在函数之外),可以被其他包访问(首字母大写)。各种函数可以返回这个错误,例如,当我们从一个文件或者 STDIN 读取时。如果它具有上下文意义,那么您应该使用此错误。作为调用者,我们可以这样使用:
package main
import (
"fmt"
"io"
)
func main() {
var input int
_, err := fmt.Scan(&input)
if err == io.EOF {
fmt.Println("no more input!")
}
}
作为最后一点,Go 确实有 panic
和 recover
函数。 panic
就像抛出异常,而 recover
就像 catch
,它们很少使用。