返回并处理错误
处理错误是可靠代码的基本功能。在本部分中,您将添加一些代码以从 greetings 模块返回错误,然后在调用方中处理错误。
-
在 greetings/greetings.go 中,添加下面突出显示的代码。
如果您不知道要向谁问候,则发送问候语毫无意义。如果名称为空,则向调用方返回错误。将以下代码复制到 greetings.go 中并保存文件。
package greetings import ( "errors" "fmt" ) // Hello returns a greeting for the named person. func Hello(name string) (string, error) { // If no name was given, return an error with a message. if name == "" { return "", errors.New("empty name") } // If a name was received, return a value that embeds the name // in a greeting message. message := fmt.Sprintf("Hi, %v. Welcome!", name) return message, nil }
在此代码中,您
-
更改函数,使其返回两个值:一个
string
和一个error
。您的调用方将检查第二个值以查看是否发生错误。(任何 Go 函数都可以返回多个值。有关更多信息,请参阅 有效的 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() { // Set properties of the predefined Logger, including // the log entry prefix and a flag to disable printing // the time, source file, and line number. log.SetPrefix("greetings: ") log.SetFlags(0) // Request a greeting message. message, err := greetings.Hello("") // If an error was returned, print it to the console and // exit the program. if err != nil { log.Fatal(err) } // If no error was returned, print the returned message // to the console. fmt.Println(message) }
在此代码中,您
-
在
hello
目录中的命令行中,运行 hello.go 以确认代码是否有效。现在你输入了一个空名称,你将收到一个错误。
$ go run . greetings: empty name exit status 1
这是 Go 中常见的错误处理:将错误作为值返回,以便调用者可以检查它。
接下来,你将使用 Go 切片来返回随机选择的问候语。