Book Image

Go Programming Blueprints

By : Mat Ryer
Book Image

Go Programming Blueprints

By: Mat Ryer

Overview of this book

Table of Contents (17 chapters)
Go Programming Blueprints
Credits
About the Author
Acknowledgments
About the Reviewers
www.PacktPub.com
Preface
Index

Combining all three implementations


To close this chapter off with a bang, we will implement a mechanism in which each Avatar implementation takes a turn in trying to get the value. If the first implementation returns the ErrNoAvatarURL error, we will try the next and so on until we find a useable value.

In avatar.go, underneath the Avatar type, add the following type definition:

type TryAvatars []Avatar

The TryAvatars type is simply a slice of Avatar objects; therefore, we will add the following GetAvatarURL method:

func (a TryAvatars) GetAvatarURL(u ChatUser) (string, error) {
  for _, avatar := range a {
    if url, err := avatar.GetAvatarURL(u); err == nil {
      return url, nil
    }
  }
  return "", ErrNoAvatarURL
}

This means that TryAvatars is now a valid Avatar implementation and can be used in place of any specific implementation. In the preceding method, we iterated over the slice of Avatar objects in an order, calling GetAvatarURL for each one. If no error is returned, we return...