返回随机问候语

在本部分中,您将更改代码,使其不再每次都返回单个问候语,而是返回几个预定义的问候语消息之一。

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

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

  1. 在 greetings/greetings.go 中,更改您的代码,使其看起来如下所示。
    package greetings
    
    import (
        "errors"
        "fmt"
        "math/rand"
    )
    
    // 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 name, errors.New("empty name")
        }
        // Create a message using a random format.
        message := fmt.Sprintf(randomFormat(), name)
        return message, nil
    }
    
    // randomFormat returns one of a set of greeting messages. The returned
    // message is selected at random.
    func randomFormat() string {
        // A slice of message formats.
        formats := []string{
            "Hi, %v. Welcome!",
            "Great to see you, %v!",
            "Hail, %v! Well met!",
        }
    
        // Return a randomly selected message format by specifying
        // a random index for the slice of formats.
        return formats[rand.Intn(len(formats))]
    }
    

    在此代码中,您

    • 添加了一个 randomFormat 函数,该函数返回一个随机选择的问候消息格式。请注意,randomFormat 以小写字母开头,使其仅可供其自身包中的代码访问(换句话说,它未导出)。
    • randomFormat 中,声明一个包含三个消息格式的 formats 切片。在声明切片时,您在方括号中省略其大小,如下所示:[]string。这告诉 Go,底层切片的数组大小可以动态更改。
    • 使用 math/rand 为从切片中选择一个项目生成一个随机数。
    • Hello 中,调用 randomFormat 函数以获取您将返回的消息的格式,然后使用格式和 name 值一起创建消息。
    • 像以前一样返回消息(或错误)。
  2. 在 hello/hello.go 中,更改您的代码,使其看起来如下所示。

    您只需将 Gladys 的名字(或您喜欢的其他名字)作为 hello.go 中 Hello 函数调用的参数添加即可。

    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("Gladys")
        // 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)
    }
  3. 在命令行中,在 hello 目录中,运行 hello.go 以确认代码是否正常工作。多次运行它,注意问候语会发生变化。
    $ go run .
    Great to see you, Gladys!
    
    $ go run .
    Hi, Gladys. Welcome!
    
    $ go run .
    Hail, Gladys! Well met!
    

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