Skip to content

Instantly share code, notes, and snippets.

@xealgo
Last active March 14, 2019 21:28
Show Gist options
  • Save xealgo/a90a2c57c987705a1eaff9840c8d0cea to your computer and use it in GitHub Desktop.
Save xealgo/a90a2c57c987705a1eaff9840c8d0cea to your computer and use it in GitHub Desktop.
package main
import "fmt"
type Ingredient struct {
Name string
Amount float64
}
type Ingredients interface {
Name() string
GetIngredients() []Ingredient
}
func DisplayDrinkIngredients(drink Ingredients) {
fmt.Println(drink.Name(), drink.GetIngredients())
}
type Drink struct {
NameFn func() string
GetIngredientsFn func() []Ingredient
}
func (d *Drink) Name() string {
if d.NameFn != nil {
return d.NameFn()
}
return ""
}
func (d *Drink) GetIngredients() []Ingredient {
if d.GetIngredientsFn != nil {
return d.GetIngredientsFn()
}
return []Ingredient{}
}
func main() {
beer := &Drink{
NameFn: func() string { return "beer" },
GetIngredientsFn: func() []Ingredient { return []Ingredient{{Name: "wheat", Amount: 10.5},{Name: "Yeast", Amount: 1.25}, {Name: "Hops", Amount: 6.0}}},
}
water := &Drink{
NameFn: func() string { return "water" },
}
DisplayDrinkIngredients(beer)
DisplayDrinkIngredients(water)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment