Combining all three implementations

To close this chapter with a bang, we will implement a mechanism in which each Avatar implementation takes a turn in trying to get a URL for a user. 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 that we are free to add methods to. Let's 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

Get Go Programming Blueprints - Second Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.