Upgrade to Pro — share decks privately, control downloads, hide ads and more …

io.Writerで学ぶGoのインターフェース

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 io.Writerで学ぶGoのインターフェース

Avatar for Daisuke Mino

Daisuke Mino

August 14, 2018
Tweet

More Decks by Daisuke Mino

Other Decks in Programming

Transcript

  1. 7 type Duck interface {¬ 8 ▸ Walk() int¬ 9

    ▸ Quack() string¬ 10 }¬ ΠϯλʔϑΣʔεͷఆٛํ๏ 
  2. 12 type RealDuck struct {¬ 13 ▸ current int¬ 14

    }¬ 15 ¬ 16 func (d RealDuck) Walk() int {¬ 17 ▸ d.current += 1¬ 18 ▸ return d.current¬ 19 }¬ 20 ¬ 21 func (d RealDuck) Quack() string {¬ 22 ▸ return "Quack! Quack!"¬ 23 }¬ ࣮૷ͦͷ
  3. 25 type FakeDuck struct{}¬ 26 ¬ 27 func (d FakeDuck)

    Walk() int {¬ 28 ▸ return 0¬ 29 }¬ 30 ¬ 31 func (d FakeDuck) Quack() string {¬ 32 ▸ return "Bow! Wow!"¬ 33 }¬ ࣮૷ͦͷ
  4. 35 func main() {¬ 36 ▸ r := RealDuck{}¬ 37

    ▸ Walk3StepsAndQuack(r)¬ 38 ¬ 39 ▸ f := FakeDuck{}¬ 40 ▸ Walk3StepsAndQuack(f)¬ 41 }¬ 42 ¬ 43 func Walk3StepsAndQuack(d Duck) {¬ 44 ▸ d.Walk()¬ 45 ▸ d.Walk()¬ 46 ▸ d.Walk()¬ 47 ▸ fmt.Println(d.Quack())¬ 48 }¬ ΠϯλʔϑΣʔεΛҾ਺ʹͱΔؔ਺
  5. 90 type Writer interface {¬ 91 ▸ Write(p []byte) (n

    int, err error)¬ 92 }¬ JP8SJUFS JPJPHP--
  6. 46 type BullBear struct {¬ 47 ▸ Logger io.Writer¬ 48

    }¬ 49 ¬ 50 func (b BullBear) DoSomething() error {¬ 51 ▸ log := []byte("did something\n")¬ 52 ▸ if _, err := b.Logger.Write(log); err != nil {¬ 53 ▸ ▸ return err¬ 54 ▸ }¬ 55 ▸ return nil¬ 62 }¬ JP8SJUFSͳ-PHHFSΛ΋ͬͨTUSVDUΛ࡞Δ
  7. 17 func logToStdout() error {¬ 18 ▸ b := BullBear{os.Stdout}¬

    19 ▸ return b.DoSomething()¬ 20 }¬ ඪ४ग़ྗʹϩάΛग़ྗ͢Δ
  8. 22 func logToFile() error {¬ 23 ▸ file, err :=

    os.Create("test.log")¬ 24 ▸ if err != nil {¬ 25 ▸ ▸ return err¬ 26 ▸ }¬ 27 ▸ b := BullBear{file}¬ 28 ▸ return b.DoSomething()¬ 29 }¬ ϑΝΠϧʹϩάΛग़ྗ͢Δ
  9. 31 func logToStdoutAndFile() error {¬ 32 ▸ file, err :=

    os.Create("test.log")¬ 33 ▸ if err != nil {¬ 34 ▸ ▸ return err¬ 35 ▸ }¬ 36 ▸ mw := io.MultiWriter(os.Stdout, file)¬ 37 ▸ b := BullBear{mw}¬ 38 ▸ return b.DoSomething()¬ 39 }¬ ඪ४ग़ྗͱϑΝΠϧʹϩάΛग़ྗ͢Δ
  10. 10 func TestLogging(t *testing.T) {¬ 11 ▸ buf := bytes.NewBuffer([]byte{})¬

    12 ▸ b := writer.BullBear{Logger: buf}¬ 13 ▸ b.DoSomething()¬ 14 ▸ if buf.String() != "did something\n" {¬ 15 ▸ ▸ t.Error("wrong log")¬ 16 ▸ }¬ 17 }¬ ϩάग़ྗΛςετ͢Δ