Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
io.Writerで学ぶGoのインターフェース
Search
Daisuke Mino
August 14, 2018
Programming
0
240
io.Writerで学ぶGoのインターフェース
Daisuke Mino
August 14, 2018
Tweet
Share
More Decks by Daisuke Mino
See All by Daisuke Mino
複雑なコンポーネントで 状態をもつのをやめた話
minodisk
0
130
Goのエラーハンドリング
minodisk
0
200
Yet another side effect layer for Redux
minodisk
2
2.7k
Other Decks in Programming
See All in Programming
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
46
30k
Elixir で IoT 開発、 Nerves なら簡単にできる!?
pojiro
1
150
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
500
今ならAmazon ECSのサービス間通信をどう選ぶか / Selection of ECS Interservice Communication 2025
tkikuc
19
3.5k
ASP.NETアプリケーションのモダナイズ インフラ編
tomokusaba
1
410
[初登壇@jAZUG]アプリ開発者が気になるGoogleCloud/Azure+wasm/wasi
asaringo
0
130
エンジニア向け採用ピッチ資料
inusan
0
160
Is Xcode slowly dying out in 2025?
uetyo
1
190
F#で自在につくる静的ブログサイト - 関数型まつり2025
pizzacat83
1
310
deno-redisの紹介とJSRパッケージの運用について (toranoana.deno #21)
uki00a
0
140
KotlinConf 2025 現地で感じたServer-Side Kotlin
n_takehata
1
230
WindowInsetsだってテストしたい
ryunen344
1
190
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.8k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Automating Front-end Workflow
addyosmani
1370
200k
Optimizing for Happiness
mojombo
379
70k
Why Our Code Smells
bkeepers
PRO
337
57k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
16
940
Documentation Writing (for coders)
carmenintech
71
4.9k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Transcript
JP8SJUFSͰֶͿ ͷΠϯλʔϑΣʔε '0-*0ࣾ(Pݴޠษڧձ !NJOPEJTL
ΠϯλʔϑΣʔεͱ%VDL5ZQJOH JP8SJUFS ·ͱΊ ࣍
*OUFSGBDFBOE%VDL5ZQJOH ΠϯλʔϑΣʔεͱ%VDL5ZQJOH “If it walks like a duck and quacks
like a duck, it must be a duck.” 1
7 type Duck interface {¬ 8 ▸ Walk() int¬ 9
▸ Quack() string¬ 10 }¬ ΠϯλʔϑΣʔεͷఆٛํ๏
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 }¬ ࣮ͦͷ
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 }¬ ࣮ͦͷ
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 }¬ ΠϯλʔϑΣʔεΛҾʹͱΔؔ
JP8SJUFS JP8SJUFS CZUFྻΛॻ͖ࠐΉͨΊͷΠϯλʔϑΣʔεͰ සग़͢ΔύοέʔδΛͬͯ۩ମྫͱڞʹ ΠϯλʔϑΣʔεΛֶͿ 2
90 type Writer interface {¬ 91 ▸ Write(p []byte) (n
int, err error)¬ 92 }¬ JP8SJUFS JPJPHP--
֎͔Βϩάͷग़ྗઌΛม͑ΒΕΔ Α͏ͳ࣮
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Λ࡞Δ
17 func logToStdout() error {¬ 18 ▸ b := BullBear{os.Stdout}¬
19 ▸ return b.DoSomething()¬ 20 }¬ ඪ४ग़ྗʹϩάΛग़ྗ͢Δ
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 }¬ ϑΝΠϧʹϩάΛग़ྗ͢Δ
ඪ४ग़ྗʹϑΝΠϧʹ ϩάΛग़ྗͨ͘͠Ͷʁ
JP.VMUJ8SJUFS
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 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 }¬ ϩάग़ྗΛςετ͢Δ
3 ·ͱΊ
w JOUFSGBDFܕ w %VDL5ZQJOHͰϙϦϞʔϑΟζϜΛ͍ͬͯ͘
None