суббота, 10 апреля 2021 г.

Создание модуля в Golang: возврат случайного приветствия

В этом посте вы измените свой код так, чтобы вместо того, чтобы каждый раз возвращать одно приветствие, он возвращал одно из нескольких предопределенных приветственных сообщений.

Примечание. Этот раздел является частью руководства, состоящего из нескольких частей, которое начинается с создания модуля 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 при запуске программы после инициализации глобальных переменных.
  • В Hello вызовете функцию randomFormat, чтобы получить формат возвращаемого сообщения, а затем используете формат и значение имени вместе для создания сообщения.
  • Вернете сообщение (или ошибку), как и раньше.

2. В hello/hello.go измените свой код так, чтобы он выглядел следующим образом.

Вы просто добавляете имя Gladys (или другое имя, если хотите) в качестве аргумента при вызове функции Hello в hello.go.

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!

Далее вы воспользуетесь срезом, чтобы поприветствовать нескольких людей.


Читайте также:


Комментариев нет:

Отправить комментарий