O'Reilly logo

Go: Design Patterns for Real-World Projects by Mat Ryer, Mario Castro Contreras, Vladimir Vivien

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

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

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required