返回并处理错误
处理错误是可靠代码的基本特征。在本节中,您将添加一些代码来从 greetings 模块返回错误,然后在调用者中处理它.
-
在 greetings/greetings.go 中,添加下面突出显示的代码.
如果您不知道该问候谁,那么发送问候是没有意义的。如果名称为空,则向调用方返回错误。将以下代码复制到 greetings.go 中并保存该文件.
package greetings import ( "errors" "fmt" ) // Hello 为指定的人返回问候语. func Hello(name string) (string, error) { // 如果没有给出名字,返回一个带有消息的错误. if name == "" { return "", errors.New("empty name") } // 如果接收到名称,则返回一个嵌入名称的值 // 在问候消息中. message := fmt.Sprintf("Hi, %v. Welcome!", name) return message, nil }
在此代码中,您:
-
更改该函数,使其返回两个值:
string
和 一个error
。您的调用方将检查第二个值以查看是否发生错误。(任何 Go 函数都可以返回多个值。有关详细信息,请参阅 Effective Go.) -
导入 Go 标准库
errors
包 以便您可以使用其errors.New
函数. -
添加
if
语句以检查无效请求(名称为空的字符串),如果请求无效,则返回错误。errors.New
函数返回一个error
,其中包含您的消息。 -
在成功返回时添加
nil
(表示无错误)作为第二个值。这样,调用方可以看到函数是否成功。
-
更改该函数,使其返回两个值:
-
在 hello/hello.go 文件中,处理错误现在由
Hello
函数返回 ,包括非错误值。将以下代码粘贴到 hello.go 中.
package main import ( "fmt" "log" "example.com/greetings" ) func main() { // 设置预定义Logger的属性,包括 // 日志条目前缀和禁用打印的标志 // 时间、源文件和行号. log.SetPrefix("greetings: ") log.SetFlags(0) // 请求问候消息. message, err := greetings.Hello("") // 如果返回错误,则将其打印到控制台并 // 退出程序. if err != nil { log.Fatal(err) } // 如果没有返回错误,则打印返回的消息 // 到控制台. fmt.Println(message) }
在此代码中,您:
-
在
hello
目录中的命令行中,运行 hello.go 以确认代码是否正常工作。现在您传入一个空名称,您将收到错误消息.
$ go run . greetings: empty name exit status 1
这是 Go 中的常见错误处理:以值形式返回错误,以便调用方可以检查它.
接下来,您将使用 Go 切片返回随机选择的问候语.