返回一个随机的问候语

在本节中,您将更改代码,以便它不是每次都返回单个问候语,而是返回几个预定义的问候语消息之一.

为此,您将使用 Go 切片。切片类似于数组,不同之处在于它的大小会随着您添加和删除项目而动态变化。slice 是 Go 最有用的类型之一.

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

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

接下来,您将使用切片来问候多个人.