diff --git a/interfaces/08-composition/book.go b/interfaces/08-composition/book.go index c583442..75fd437 100644 --- a/interfaces/08-composition/book.go +++ b/interfaces/08-composition/book.go @@ -8,19 +8,29 @@ package main import ( + "encoding/json" "fmt" "strconv" "time" ) type book struct { - *product - published interface{} + product + Published interface{} } func (b *book) String() string { - p := format(b.published) - return fmt.Sprintf("%s - (%v)", b.product, p) + p := format(b.Published) + return fmt.Sprintf("%s - (%v)", &b.product, p) +} + +func (b *book) MarshalJSON() ([]byte, error) { + type jbook book + + jb := (*jbook)(b) + jb.Published = format(b.Published) + + return json.Marshal(jb) } func format(v interface{}) string { diff --git a/interfaces/08-composition/game.go b/interfaces/08-composition/game.go index 6811170..3604b15 100644 --- a/interfaces/08-composition/game.go +++ b/interfaces/08-composition/game.go @@ -8,5 +8,5 @@ package main type game struct { - *product + product } diff --git a/interfaces/08-composition/list.go b/interfaces/08-composition/list.go index bd87c8c..2229250 100644 --- a/interfaces/08-composition/list.go +++ b/interfaces/08-composition/list.go @@ -12,12 +12,9 @@ import ( "strings" ) -type summer interface { - sum() money -} - type item interface { - summer // same as: `sum() money` + sum() money + discount(float64) fmt.Stringer // same as: `String() string` } @@ -45,13 +42,7 @@ func (l list) sum() (total money) { } func (l list) discount(ratio float64) { - type discounter interface { - discount(float64) - } - for _, it := range l { - if it, ok := it.(discounter); ok { - it.discount(ratio) - } + it.discount(ratio) } } diff --git a/interfaces/08-composition/main.go b/interfaces/08-composition/main.go index 606bc06..df022e2 100644 --- a/interfaces/08-composition/main.go +++ b/interfaces/08-composition/main.go @@ -8,35 +8,50 @@ package main import ( + "encoding/json" "fmt" "sort" ) func main() { store := list{ - &book{&product{"moby dick", 10}, 118281600}, - &book{&product{"odyssey", 15}, "733622400"}, - &book{&product{"hobbit", 25}, nil}, - &puzzle{&product{"rubik's cube", 5}}, - &game{&product{"minecraft", 20}}, - &game{&product{"tetris", 5}}, - &toy{&product{"yoda", 150}}, + &book{product{"moby dick", 10}, 118281600}, + &book{product{"odyssey", 15}, "733622400"}, + &book{product{"hobbit", 25}, nil}, + &puzzle{product{"rubik's cube", 5}}, + &game{product{"minecraft", 20}}, + &game{product{"tetris", 5}}, + &toy{product{"yoda", 150}}, } + out, _ := json.Marshal(store) + fmt.Println(string(out)) + + var ( + nilItem item + nilBook *book + ) + + fmt.Println("nilBook ?", nilBook == nil) + fmt.Println("nilItem?", nilItem == nil) + + nilItem = nilBook + fmt.Println("nilItem?", nilItem == nil) + books := store[:3] - others := store[3:] books.discount(.5) fmt.Printf("%s\n", store) + others := store[3:] sort.Sort(byPrice(others)) fmt.Printf("\n%s\n", store) store = list{books, others} fmt.Printf("\n%s\n", store) - // store.discount(.5) - // // sort.Sort(sort.Reverse(byPrice(store))) - // sort.Sort(byName(store)) - // fmt.Println(store) + store.discount(.5) + // sort.Sort(sort.Reverse(byPrice(store))) + sort.Sort(byName(store)) + fmt.Println(store) } diff --git a/interfaces/08-composition/product.go b/interfaces/08-composition/product.go index f1b3383..84e2ce6 100644 --- a/interfaces/08-composition/product.go +++ b/interfaces/08-composition/product.go @@ -10,18 +10,18 @@ package main import "fmt" type product struct { - title string - price money + Title string + Price money } func (p *product) discount(ratio float64) { - p.price *= money(1 - ratio) + p.Price *= money(1 - ratio) } func (p *product) sum() money { - return p.price + return p.Price } func (p *product) String() string { - return fmt.Sprintf("%-15s: %s", p.title, p.price) + return fmt.Sprintf("%-15s: %s", p.Title, p.Price) } diff --git a/interfaces/08-composition/puzzle.go b/interfaces/08-composition/puzzle.go index bf3ecc4..acbaa47 100644 --- a/interfaces/08-composition/puzzle.go +++ b/interfaces/08-composition/puzzle.go @@ -8,5 +8,5 @@ package main type puzzle struct { - *product + product } diff --git a/interfaces/08-composition/toy.go b/interfaces/08-composition/toy.go index 73e99c4..ab5613d 100644 --- a/interfaces/08-composition/toy.go +++ b/interfaces/08-composition/toy.go @@ -8,5 +8,5 @@ package main type toy struct { - *product + product }