返回随机问候

By | 2021年9月16日

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

注意:本主题是从创建 Go 模块开始的多部分教程的一部分。

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

slice 是 Go 最有用的类型之一。

您将添加一小部分来包含三个问候消息,然后让您的代码随机返回其中一个消息。

有关切片的更多信息,请参阅Go 博客中的 Goslice

  1. 在 greetings/greetings.go 中,更改您的代码,使其看起来如下所示。
    package greetings
    
    import (
       "errors"
       "fmt"
       "math/rand"
       "time"
    )
    
    // 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
    }
    
    // init sets initial values for variables used in the function.
    func init() {
       rand.Seed(time.Now().UnixNano())
    }
    
    // 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具有三种消息格式的slice。当声明一个slice,你在括号忽略它的大小,像这样:[]string。这告诉 Go 切片底层数组的大小可以动态更改。

  • 使用 math/rand 生成一个随机数,用于从切片中选择一个项目。

  • 添加一个init函数以rand使用当前时间为包做种子。Goinit在程序启动时自动执行函数,在全局变量初始化后。

    有关init函数的更多信息,请参阅 Effective Go

  • Hello,调用该randomFormat函数以获取您将返回的消息的格式,然后一起使用该格式和 name值来创建该消息。

  • 像以前一样返回消息(或错误)。

  1. 在 hello/hello.go 中,更改您的代码,使其看起来如下所示。

    您只是将 Gladys 的名字(或不同的名字,如果您喜欢)作为参数添加到Hello/hello.go 中的函数调用中。

    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)
    }
    
  2. 在命令行的 hello 目录中,运行 hello.go 以确认代码有效。多次运行它,注意到问候语发生了变化。
    $ go run .
    Great to see you, Gladys!
    
    $ go run .
    Hi, Gladys. Welcome!
    
    $ go run .
    Hail, Gladys! Well met!
    

接下来,您将使用slice来实现多个人问候。

请关注公众号获取更多资料

发表评论

电子邮件地址不会被公开。 必填项已用*标注