Go语言基地
Tutorilas创建模块

返回随机问候

注意: 本文是系列教程的一部分,该系列始于 创建 Go 模块

在本节中,你将更改代码,使其不再每次都返回相同的问候语,而是返回几个预定义问候语中的一个。

为此,你将使用 Go 切片。切片类似于数组,但其大小会随着添加和删除项目而动态变化。切片是 Go 中最有用的类型之一。

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

步骤

1. 修改 greetings/greetings.go 以返回随机问候

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 以小写字母开头,使其仅对其所在包中的代码可访问(换句话说,它未导出)。
  • randomFormat 中,声明一个包含三种消息格式的 formats 切片。声明切片时,省略括号中的大小,像这样:[]string。这告诉 Go,切片底层数组的大小可以动态更改。
  • 使用 math/rand 生成一个随机数,用于从切片中选择一个项目。
  • Hello 中,调用 randomFormat 函数以获取你将返回的消息的格式,然后将格式和 name 值一起用于创建消息。
  • 像以前一样返回消息(或错误)。

2. 更新 hello/hello.go 以使用 "Gladys" 这个名字

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

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

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.go 以确认代码正常工作

hello 目录的命令行中,运行 hello.go 以确认代码正常工作。多次运行,注意问候语的变化。

$ go run .
Great to see you, Gladys!

$ go run .
Hi, Gladys. Welcome!

$ go run .
Hail, Gladys! Well met!

结论

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

On this page