返回随机问候
在本节中,你将修改代码,使其不再每次返回固定的问候语,而是从一组预定义的问候消息中随机返回一条。
为此,你将使用 Go 的切片(slice)。切片类似于数组,但其大小会随着你添加和移除元素而动态变化。切片是 Go 最有用的类型之一。
你将添加一个包含三条问候消息的小型切片,然后让你的代码随机返回其中一条消息。关于切片的更多信息,请参阅 Go 博客中的Go 切片。
-
在 greetings/greetings.go 文件中,修改代码使其如下所示。
package greetings import ( "errors" "fmt" "math/rand" ) // Hello 为指定名称的人返回一条问候语。 func Hello(name string) (string, error) { // 如果没有提供名字,则返回一个带有消息的错误。 if name == "" { return name, errors.New("empty name") } // 使用随机格式创建消息。 message := fmt.Sprintf(randomFormat(), name) return message, nil } // randomFormat 从一组问候消息中返回一条。返回的消息是随机选择的。 func randomFormat() string { // 消息格式的切片。 formats := []string{ "Hi, %v. Welcome!", "Great to see you, %v!", "Hail, %v! Well met!", } // 通过为格式切片指定一个随机索引来返回随机选择的消息格式。 return formats[rand.Intn(len(formats))] }在此代码中,你做了以下操作:
-
添加了一个
randomFormat函数,该函数返回一个随机选择的问候消息格式。请注意,randomFormat以小写字母开头,因此它仅对其所属 package(包)内的代码可访问(换句话说,它不是导出的)。 -
在
randomFormat中,声明了一个包含三种消息格式的formats切片。声明切片时,你省略了方括号中的大小,例如:[]string。这告诉 Go,支撑该切片的底层数组的大小可以动态改变。 -
使用了
math/rand包 来生成一个随机数,用于从切片中选择一个条目。 -
在
Hello中,调用randomFormat函数以获取你将要返回的消息格式,然后将该格式与name值结合使用来创建消息。 - 像之前一样返回消息(或错误)。
-
添加了一个
-
在 hello/hello.go 文件中,修改代码使其如下所示。
你只需在 hello.go 中将 Gladys 的名字(或者你希望的其他名字)作为参数添加到
Hello函数调用中。package main import ( "fmt" "log" "example.com/greetings" ) func main() { // 设置预定义 Logger 的属性,包括 // 日志条目前缀和一个标志,用于禁用打印 // 时间、源文件和行号。 log.SetPrefix("greetings: ") log.SetFlags(0) // 请求一条问候消息。 message, err := greetings.Hello("Gladys") // 如果返回了错误,则将其打印到控制台并 // 退出程序。 if err != nil { log.Fatal(err) } // 如果没有返回错误,则将返回的消息 // 打印到控制台。 fmt.Println(message) } -
在命令行中,进入 hello 目录,运行 hello.go 以确认代码是否正常工作。多次运行它,注意问候语的变化。
$ go run . Great to see you, Gladys! $ go run . Hi, Gladys. Welcome! $ go run . Hail, Gladys! Well met!
接下来,你将使用切片来问候多人。