返回一个随机的问候语
在本节中,您将更改代码,以便它不是每次都返回单个问候语,而是返回几个预定义的问候语消息之一.
为此,您将使用 Go 切片。切片类似于数组,不同之处在于它的大小会随着您添加和删除项目而动态变化。slice 是 Go 最有用的类型之一.
您将添加一个小的切片来包含三个问候消息,然后让您的代码随机返回其中一个消息。有关切片的更多信息,请参阅Go 博客中的Go 切片.
-
在 greetings/greetings.go 中,更改您的代码,使其看起来如下所示.
package greetings import ( "errors" "fmt" "math/rand" "time" ) // Hello 为指定的人返回问候语. func Hello(name string) (string, error) { // 如果没有给出名字,返回一个带有错误的消息. if name == "" { return name, errors.New("empty name") } // 使用随机格式创建消息. message := fmt.Sprintf(randomFormat(), name) return message, nil } // init 为函数中使用的变量设置初始值. func init() { rand.Seed(time.Now().UnixNano()) } // 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
以小写字母开头,使其只能由其自己的包中的代码访问(换句话说,它不会导出). -
在
randomFormat
中,声明具有三种消息格式的格式切片。声明切片时,请在括号中省略其大小,如下所示:[]string
。这告诉 Go,可以动态更改切片底层数组的大小. -
使用
math/rand
包生成一个随机数,用于从切片中选择项目。 -
添加
init
函数以使用当前时间为rand
包设定种子。Go 在初始化全局变量后,在程序启动时自动执行init
函数。有关init
函数的详细信息,请参阅Effective Go。 -
在
Hello
中,调用randomFormat
函数以获取要返回的消息的格式,然后同时使用格式和name
值来创建消息。 - 像以前一样返回消息(或错误).
-
添加一个
-
在 hello/hello.go 中,更改代码,使其如下所示.
您只需将 Gladys 的名称(或者其他名称,如果您愿意)作为参数添加到 hello.go 中的
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!
接下来,您将使用切片来问候多个人.