返回随机问候

在本节中,你将修改代码,使其不再每次返回固定的问候语,而是从一组预定义的问候消息中随机返回一条。

为此,你将使用 Go 的切片(slice)。切片类似于数组,但其大小会随着你添加和移除元素而动态变化。切片是 Go 最有用的类型之一。

你将添加一个包含三条问候消息的小型切片,然后让你的代码随机返回其中一条消息。关于切片的更多信息,请参阅 Go 博客中的Go 切片

  1. 在 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 值结合使用来创建消息。
    • 像之前一样返回消息(或错误)。
  2. 在 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)
    }
  3. 在命令行中,进入 hello 目录,运行 hello.go 以确认代码是否正常工作。多次运行它,注意问候语的变化。
    $ go run .
    Great to see you, Gladys!
    
    $ go run .
    Hi, Gladys. Welcome!
    
    $ go run .
    Hail, Gladys! Well met!
    

接下来,你将使用切片来问候多人。