Slide 1

Slide 1 text

JP8SJUFSͰֶͿ ͷΠϯλʔϑΣʔε '0-*0ࣾ಺(Pݴޠษڧձ !NJOPEJTL

Slide 2

Slide 2 text

ΠϯλʔϑΣʔεͱ%VDL5ZQJOH JP8SJUFS ·ͱΊ ໨࣍

Slide 3

Slide 3 text

*OUFSGBDFBOE%VDL5ZQJOH ΠϯλʔϑΣʔεͱ%VDL5ZQJOH “If it walks like a duck and quacks like a duck, it must be a duck.” 1

Slide 4

Slide 4 text

7 type Duck interface {¬ 8 ▸ Walk() int¬ 9 ▸ Quack() string¬ 10 }¬ ΠϯλʔϑΣʔεͷఆٛํ๏

Slide 5

Slide 5 text

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 }¬ ࣮૷ͦͷ

Slide 6

Slide 6 text

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 }¬ ࣮૷ͦͷ

Slide 7

Slide 7 text

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 }¬ ΠϯλʔϑΣʔεΛҾ਺ʹͱΔؔ਺

Slide 8

Slide 8 text

JP8SJUFS JP8SJUFS CZUFྻΛॻ͖ࠐΉͨΊͷΠϯλʔϑΣʔεͰ සग़͢ΔύοέʔδΛ࢖ͬͯ۩ମྫͱڞʹ ΠϯλʔϑΣʔεΛֶͿ 2

Slide 9

Slide 9 text

90 type Writer interface {¬ 91 ▸ Write(p []byte) (n int, err error)¬ 92 }¬ JP8SJUFS JPJPHP--

Slide 10

Slide 10 text

֎͔Βϩάͷग़ྗઌΛม͑ΒΕΔ Α͏ͳ࣮૷

Slide 11

Slide 11 text

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Λ࡞Δ

Slide 12

Slide 12 text

17 func logToStdout() error {¬ 18 ▸ b := BullBear{os.Stdout}¬ 19 ▸ return b.DoSomething()¬ 20 }¬ ඪ४ग़ྗʹϩάΛग़ྗ͢Δ

Slide 13

Slide 13 text

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 }¬ ϑΝΠϧʹϩάΛग़ྗ͢Δ

Slide 14

Slide 14 text

ඪ४ग़ྗʹ΋ϑΝΠϧʹ΋ ϩάΛग़ྗͨ͘͠Ͷʁ

Slide 15

Slide 15 text

JP.VMUJ8SJUFS

Slide 16

Slide 16 text

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 }¬ ඪ४ग़ྗͱϑΝΠϧʹϩάΛग़ྗ͢Δ

Slide 17

Slide 17 text

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 }¬ ϩάग़ྗΛςετ͢Δ

Slide 18

Slide 18 text

3 ·ͱΊ

Slide 19

Slide 19 text

w JOUFSGBDF͸ܕ w %VDL5ZQJOHͰϙϦϞʔϑΟζϜΛ΍͍ͬͯ͘

Slide 20

Slide 20 text

No content