Возврат случайного приветствия
В этом разделе вы измените свой код таким образом, чтобы вместо возврата одного приветствия каждый раз, он возвращал одно из нескольких заранее определённых сообщений приветствия.
Для этого вы будете использовать Go срез. Срез похож на массив, но его размер динамически изменяется при добавлении и удалении элементов. Срез — одна из самых полезных конструкций в Go.
Вы добавите небольшой срез для хранения трёх приветственных сообщений, а затем ваш код будет возвращать одно из этих сообщений случайным образом. Подробнее о срезах можно прочитать в Go slices в блоге Go.
-
В greetings/greetings.go измените код так, чтобы он выглядел следующим образом.
package greetings import ( "errors" "fmt" <ins>"math/rand"</ins> ) // 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(<ins>randomFormat()</ins>, name) return message, nil } <ins>// 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))] }</ins>В этом коде вы:
-
Добавляете функцию
randomFormat, которая возвращает случайно выбранное форматирование для сообщения приветствия. Обратите внимание, чтоrandomFormatначинается с маленькой буквы, поэтому она доступна только внутри своего пакета (иными словами, она не экспортируется). -
В
randomFormatобъявляется срезformatsс тремя форматами сообщений. При объявлении среза размер указывается в скобках необязательно, как[]string. Это указывает Go, что размер массива, лежащего в основе среза, может быть изменён динамически. -
Используете пакет
math/randдля генерации случайного числа, которое используется для выбора элемента из среза. -
В функции
Helloвызывается функцияrandomFormat, чтобы получить формат сообщения, которое будет возвращено, а затем формат и значениеnameиспользуются вместе для создания сообщения. - Возвращаете сообщение (или ошибку), как это делалось раньше.
-
Добавляете функцию
-
В 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. <ins>message, err := greetings.Hello("Gladys")</ins> // 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) } -
В командной строке, в директории hello, запустите hello.go, чтобы убедиться,
что код работает. Запустите его несколько раз, обратив внимание на то, как
приветствие меняется.
$ go run . Great to see you, Gladys! $ go run . Hi, Gladys. Welcome! $ go run . Hail, Gladys! Well met!
Далее вы будете использовать срез для приветствия нескольких людей.