In greetings/greetings.go, add the code below.
- package greetings
-
- import (
- "errors"
- "fmt"
- )
-
- // 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 "", errors.New("empty name")
- }
-
- // If a name was received, return a value that embeds the name
- // in a greeting message.
- message := fmt.Sprintf("Hi, %v. Welcome!", name)
- return message, nil
- }
2.In your hello/hello.go file, handle the error now returned by the Hello function, along with the non-error value.
- 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("")
- // 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.At the command line in the hello directory, run hello.go to confirm that the code works.

randomFormat function that returns a randomly selected format for a greeting message. Note that randomFormat starts with a lowercase letter, making it accessible only to code in its own package (in other words, it's not exported).randomFormat, declare a formats slice with three message formats. When declaring a slice, you omit its size in the brackets, like this: []string. This tells Go that the size of the array underlying the slice can be dynamically changed.Hello, call the randomFormat function to get a format for the message you'll return, then use the format and name value together to create the message.- 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))]
- }
- 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("Maxwell")
- // 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)
- }
At the command line, in the hello directory, run hello.go to confirm that the code works. Run it multiple times, noticing that the greeting changes.

- 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
- }
-
- // Hellos returns a map that associates each of the named people
- // with a greeting message.
- func Hellos(names []string) (map[string]string, error) {
- // A map to associate names with messages.
- messages := make(map[string]string)
- // Loop through the received slice of names, calling
- // the Hello function to get a message for each name.
- for _, name := range names {
- message, err := Hello(name)
- if err != nil {
- return nil, err
- }
- // In the map, associate the retrieved message with
- // the name.
- messages[name] = message
- }
- return messages, 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))]
- }
- 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)
-
- // A slice of names.
- names := []string{"Gladys", "Samantha", "Darrin"}
-
- // Request greeting messages for the names.
- messages, err := greetings.Hellos(names)
- if err != nil {
- log.Fatal(err)
- }
- // If no error was returned, print the returned map of
- // messages to the console.
- fmt.Println(messages)
- }