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
250
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.8k
Other Decks in Programming
See All in Programming
PC-6001でPSG曲を鳴らすまでを全部NetBSD上の Makefile に押し込んでみた / osc2025hiroshima
tsutsui
0
210
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
3
790
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
140
AI Agent Dojo #4: watsonx Orchestrate ADK体験
oniak3ibm
PRO
0
130
実はマルチモーダルだった。ブラウザの組み込みAI🧠でWebの未来を感じてみよう #jsfes #gemini
n0bisuke2
3
1.4k
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
7
4.4k
2年のAppleウォレットパス開発の振り返り
muno92
PRO
0
180
CSC307 Lecture 04
javiergs
PRO
0
640
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
640
メルカリのリーダビリティチームが取り組む、AI時代のスケーラブルな品質文化
cloverrose
2
470
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
750
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.5k
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
527
40k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
550
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
The Language of Interfaces
destraynor
162
26k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
120
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
0
1.1k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
120
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
71k
Optimizing for Happiness
mojombo
379
70k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
270
Embracing the Ebb and Flow
colly
88
4.9k
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