From e0b2786fd9d3d4fe4ebc2d1883f75013882dc0d5 Mon Sep 17 00:00:00 2001 From: Inanc Gumus Date: Fri, 23 Aug 2019 11:03:51 +0300 Subject: [PATCH] update: interfaces lecture --- interfaces/04-interfaces/list.go | 17 +++++++ interfaces/04-interfaces/main.go | 16 +++---- interfaces/04-interfaces/power/main.go | 64 ++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 interfaces/04-interfaces/power/main.go diff --git a/interfaces/04-interfaces/list.go b/interfaces/04-interfaces/list.go index 7416ced..aeef41f 100644 --- a/interfaces/04-interfaces/list.go +++ b/interfaces/04-interfaces/list.go @@ -22,6 +22,8 @@ func (l list) print() { } for _, it := range l { + // fmt.Printf("(%-10T) --> ", it) + it.print() // you cannot access to the discount method of the game type. @@ -29,3 +31,18 @@ func (l list) print() { // it.discount(.5) } } + +// PREVIOUS CODE: + +// type list []*game + +// func (l list) print() { +// if len(l) == 0 { +// fmt.Println("Sorry. Our store is closed. We're waiting for the delivery 🚚.") +// return +// } + +// for _, it := range l { +// it.print() +// } +// } diff --git a/interfaces/04-interfaces/main.go b/interfaces/04-interfaces/main.go index 8e6b29d..755f553 100644 --- a/interfaces/04-interfaces/main.go +++ b/interfaces/04-interfaces/main.go @@ -15,15 +15,13 @@ func main() { rubik = puzzle{title: "rubik's cube", price: 5} ) + // thanks to the printer interface we can add different types of values + // to the list. + // + // only rule: they need to implement the `printer` interface. + // to do that: each type needs to have a print method. + var store list store = append(store, &minecraft, &tetris, mobydick, rubik) - - tetris.discount(.8) - // printer(tetris).discount(.8) store.print() - - // p can store a value of any type that has a `print()` method - var p printer - p = puzzle{title: "sidewinder", price: 10} - p.print() -} \ No newline at end of file +} diff --git a/interfaces/04-interfaces/power/main.go b/interfaces/04-interfaces/power/main.go new file mode 100644 index 0000000..a1f9793 --- /dev/null +++ b/interfaces/04-interfaces/power/main.go @@ -0,0 +1,64 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + "fmt" + "math/rand" + "time" +) + +// Socket has the power! +type Socket struct { + power int +} + +// Plug a device to draw power from the `Socket` +func (s *Socket) Plug(device PowerDrawer) { + n := rand.Intn(50) + s.power -= n + device.Draw(n) +} + +// PowerDrawer can be any type that can be powered +type PowerDrawer interface { + Draw(power int) +} + +// ----- + +// Kettle can be powered +type Kettle struct{} + +// Draw power to a Kettle +func (Kettle) Draw(power int) { + fmt.Printf("Kettle is drawing %dkW of electrical power.\n", power) +} + +// Mixer can be powered +type Mixer struct{} + +// Draw power to a Mixer +func (Mixer) Draw(power int) { + fmt.Printf("Mixer is drawing %dkW of electrical power.\n", power) +} + +// ----- + +func main() { + rand.Seed(time.Now().UnixNano()) + + kettle := Kettle{} + mixer := Mixer{} + + socket := &Socket{100} + socket.Plug(kettle) + socket.Plug(mixer) + + fmt.Printf("Socket's available power is %d kW.\n", socket.power) +}