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
Go言語100Tips No.1~5 まとめ
Search
Tomoki Ota
May 31, 2024
Programming
4
55k
Go言語100Tips No.1~5 まとめ
Go言語100Tips No.1~5をまとめました。
Tomoki Ota
May 31, 2024
Tweet
Share
More Decks by Tomoki Ota
See All by Tomoki Ota
アーキテクチャの価値
tomo1227
0
40
アーキテクチャとビジネスロジック
tomo1227
0
44
【Go言語】テスト
tomo1227
0
22
【Go言語】クロージャ
tomo1227
0
210
【Go言語】イテレータ
tomo1227
0
30
【Go言語】エラーハンドリング
tomo1227
0
33
AIに淘汰されないようにするには?
tomo1227
0
30
【Go言語】range
tomo1227
0
21
【Go言語】break
tomo1227
0
33
Other Decks in Programming
See All in Programming
Domain-Driven Transformation
hschwentner
2
1.9k
もう僕は OpenAPI を書きたくない
sgash708
5
1.8k
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
50
17k
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
750
コミュニティ駆動 AWS CDK ライブラリ「Open Constructs Library」 / community-cdk-library
gotok365
2
150
ソフトウェアエンジニアの成長
masuda220
PRO
12
1.8k
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
270
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
170
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
170
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
150
仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don't repeat yourself" for resilience to specification changes
mkmk884
5
1k
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Producing Creativity
orderedlist
PRO
344
39k
Writing Fast Ruby
sferik
628
61k
Designing Experiences People Love
moore
140
23k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Designing for Performance
lara
604
68k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
It's Worth the Effort
3n
184
28k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
Building Your Own Lightsaber
phodgson
104
6.2k
Transcript
(Pݴޠ5*14 Ћ 5PNPLJ0UB /Pd/P 1
5*1 γϟυʔΠϯά 2
γϟυʔΠϯάͱʁ ҟͳΔείʔϓͰಉ໊͡લͷม͕༻͞Ε ͨͱ͖ʹɺҟͳΔมͱͯ͠ѻΘΕΔ͜ͱɻ 3
(PͰ࠶એݴίϯύΠϧΤϥʔ ಉ͡είʔϓ ࠶એݴ https://go.dev/play/p/77k9VUeMwps 4
ಉ͡είʔϓ ࠶એݴ ྫ֎ https://go.dev/play/p/irqsWg06HT1 a࠶ೖɺb࠶એݴʹͳΔ 5
ҟͳΔείʔϓ γϟυʔΠϯά είʔϓ͕ҟͳΔͱɺม໊͕ҰॹͰҧ͏มͱͯ͠ѻΘΕΔ https://go.dev/play/p/w7gbbczDzSX 6
είʔϓͱԿͰ͠ΐ͏ʁ 2VJ[̍ 7
JGͳͲ\^Ͱ۠ΒΕͨΒ είʔϓ͕มΘΔ ❌ 8
ͰɺϒϩοΫͱʁ 2VJ[ 9
ϒϩοΫ㱠είʔϓ 10
ϒϩοΫͱʁ ιʔείʔυͷʮ͔ͨ·Γʯͷ͜ͱɻ ݫີʹ͍͏ͱεςʔτϝϯτ܈ɻۭͰ༗ޮɻ FH\^Ͱғ·ΕͨྖҬ 11
ϒϩοΫͷछྨ w ໌ࣔతϒϩοΫ\^Ͱғ·Εͨεςʔτϝϯτ܈ w ҉తϒϩοΫ VOJWFSTFશͯͷ(Pͷιʔείʔυͷ֎ଆΛแΉϒϩ οΫ QBDLBHFύοέʔδશମΛแΉϒϩοΫ
fi MFϑΝΠϧͷϒϩοΫ *G GPS TXJUDIϒϩοΫ TXJUDI TFMFDUʹ͓͚ΔઅϒϩοΫ 12
FHGPSϒϩοΫ https://go.dev/play/p/2FGM_uX1kZb GPSd^͕ϒϩοΫ \d^ϒϩοΫͰͳ͍ 13
TXJUDI TFMFDUʹ͓͚ΔઅϒϩοΫ https://go.dev/play/p/dH3q4JG4HUj 14
είʔϓͱʁ ࣝผࢠ YͳͲ ͷએݴ͕ٴͿൣғ 15
είʔϓWTϒϩοΫ ϒϩοΫ: ιʔείʔυͷࣈ۟తɾॴతͳཧ ʹ͍ۙϨΠϠʔͷ είʔϓ : ࣝผࢠͷએݴͷ༰·Ͱ౿ΈࠐΜͰߟ ͑ΔߴϨΠϠʔͷ 16
γϟυʔΠϯά άϩʔόϧมͷ߹ 17
γϟυʔΠϯά https://go.dev/play/p/Wh04ZwS7HH4 18 O FSSͷܗʹؾΛ͚Δ O FSSʹ͢ΔͱΤϥʔ͕ग़ͯ͠·͏ ͷͰɺΒ͵·ʹʹͯ͠γϟυΠϯά ͯ͠͠·͏͜ͱ͕ଟ͍
γϟυʔΠϯά https://go.dev/play/p/Wh04ZwS7HH4 19 γϟυΠϯάͨ͘͠ͳ͍ͱ͖ FSSΛલͬͯએݴ͢Δ
ಉ͡είʔϓ ࠶એݴ ࠶ܝ https://go.dev/play/p/irqsWg06HT1 a࠶ೖɺb࠶એݴʹͳΔ aͷܕ͕ҧ͏ͱΤϥʔ err࠶ೖ 20
γϟυʔΠϯά ϦϯλʔΛͬͯγϟυʔΠϯάΛ ݕ͢Δ͜ͱՄೳ ઃఆ͕ඞཁ TIBEPXΛ͏ 21
5*1 ϝϯλϧίʔυϞσϧͷܗ 22
ϝϯλϧίʔυϞσϧͷܗ w ωετͤ͞ͳ͍ɹˠૣظSFUVSOͰฦ͢ w ϋοϐʔύεΛࠨଆͰἧ͑Δ FMTFΘͳ͍ w ϊϯϋοϐʔύε݅Λసͯ͠ɺϋοϐʔ ύεʹ͢Δ
Մಡੑͷ͍͍ίʔυΛॻ͚ͬͯ͜ͱ 23
ϝϯλϧίʔυϞσϧͷྫ 24
5*1 JOJUؔ 25
JOJUؔͱʁ ΞϓϦέʔγϣϯͷঢ়ଶΛॳظԽ ͢ΔͨΊʹ༻͍ΒΕΔؔɻ ҾΛऔΒͣɺԿΛฦ͞ͳ͍ɻ 26
JOJUؔͷ࣮ߦλΠϛϯά ύοέʔδͷ શͯͷఆͱมએݴͷධՁ ύοέʔδ͕ॳظԽ JOJUؔͷ࣮ߦ https://go.dev/play/p/d0CtZAhTRhF 27
NBJO͕ผύοέʔδʹґଘ͢Δͱ͖ main͔Βfooͷfunc()ΛݺͿͱ͖ͷ࣮ߦॱ 28
ύοέʔδʹෳͷJOJU͕ؔ͋Δ߹ ϑΝΠϧͷΞϧϑΝϕοτॱʹ࣮ߦ͞ΕΔɻ BHPͷJOJU ˠCHPͷJOJU ˠDHPͷJOJU 29
ύοέʔδʹෳͷJOJU͕ؔ͋Δ߹ ϑΝΠϧ໊Λม͑ͨͱ͖ʹ࣮ߦॱ͕มߋ͞ΕΔՄೳੑ͕͋Δɻ JOJU ͷॱ൪ʹґଘ͍͚ͯ͠ͳ͍ɻ 30
෭࡞༻ͷͨΊͷJOJU ଞύοέʔδͷJOJU ͚ͩΛ࣮ߦ͍ͨ͠߹ JNQPSUͰϒϥϯΫࣝผࢠ@Λ͚ͭΔɻ 31
෭࡞༻ͷͨΊͷJOJU NBJOؔͷதͰJOJU࣮ؔߦͰ͖ͳ͍ɻ 32
JOJU Λ͖Ͱͳ͍ͱ͖ σʔλϕʔεͷίωΫγϣϯϓʔϧͷอ࣋ σʔλϕʔεΛΦʔϓϯͯ͠ 1JOH͕Ͱ͖Δ͔֬ೝ͠ άϩʔόϧมʹೖ͍ͯ͠Δɻ 33
JOJU Λ͖Ͱͳ͍ͱ͖ JOJU͕ؔΤϥʔΛฦ͞ͳ͍ 34
JOJU Λ͖Ͱͳ͍ͱ͖ JOJU͕ؔΤϥʔΛฦ͞ͳ͍ ˠΤϥʔΛ௨͢ΔखஈύχοΫΛى͜͠ɺ ΞϓϦέʔγϣϯΛఀࢭ͢Δ͜ͱ 35
JOJU Λ͖Ͱͳ͍ͱ͖ JOJU͕ؔΤϥʔΛฦ͞ͳ͍ ˠΤϥʔΛ௨͢ΔखஈύχοΫΛى͜͠ɺ ΞϓϦέʔγϣϯΛఀࢭ͢Δ͜ͱ ˠݺͼग़͠ݩͰϦτϥΠϑΥʔϧόοΫ͕ Ͱ͖ͳ͘ͳΔ 36
JOJU Λ͖Ͱͳ͍ͱ͖ ςετέʔεΛ࣮ߦ͢Δલʹ JOJU͕࣮ߦ͞ΕΔ 37
JOJU Λ͖Ͱͳ͍ͱ͖ ςετέʔεΛ࣮ߦ͢Δલʹ JOJU͕࣮ߦ͞ΕΔ ˠ%#ͷίωΫγϣϯΛ࡞͢Δඞཁ͕ͳ͍ ϢʔςΟϦςΟؔʹର͢Δ୯ମςετͳͲͷ ςετ͕ॻ͖ʹ͘͘ͳΔ 38
JOJU Λ͖Ͱͳ͍ͱ͖ σʔλϕʔεͷίωΫγϣϯϓʔϧΛ άϩʔόϧมʹೖ͢Δඞཁ͕͋Δ ˠͲͷ͔ؔΒͰύοέʔδͷάϩʔ όϧมΛมߋͰ͖ͯ͠·͏ ˠάϩʔόϧมʹґଘ͢ΔؔΓ ͞Ε ͳ͍ͷͰɺ୯ମςετ͕ෳࡶʹͳΔՄೳੑ͕
͋Δ 39
JOJU Λ͖Ͱͳ͍ͱ͖ 40
JOJU Λ͍͍ͬͯͱ͖ JOJU͕ࣦഊ͢Δ͜ͱͳ͍ άϩʔόϧมΛ࡞Δඞཁ͕ͳ͍ ୯ମςετʹӨڹΛ༩͑Δ͜ͱ͕ͳ͍ 41
JOJU Λ͍͍ͬͯͱ͖ JOJU͕ࣦഊ͢Δ͜ͱͳ͍ άϩʔόϧมΛ࡞Δඞཁ͕ͳ͍ ୯ମςετʹӨڹΛ༩͑Δ͜ͱ͕ͳ͍ 42
JOJU Λ͍͍ͬͯͱ͖ JOJU͕ࣦഊ͢Δ͜ͱͳ͍ IBOEMFS͕OJMͰͳ͍ͷͰɺύχ οΫʹͳΒͳ͍ άϩʔόϧมΛ࡞Δඞཁ͕ͳ͍
୯ମςετʹӨڹΛ༩͑Δ͜ͱ͕ ͳ͍ GoͷެࣜϒϩάͰ੩తͳHTTPઃఆΛ ߦ͏ͨΊʹinitؔΛ༻͍ͯ͠Δɻ 43
5*1 HFUUFSͱTFUUFSͷ͍ํ 44
ͳͥHFUUFSͱTFUUFSΛ͏ͷ͔ʁ HFUUFS TFUUFSΧϓηϧԽΛ ࣮ݱ͢ΔͨΊʹ͋Δɻ 45
ΧϓηϧԽͱʁ ΦϒδΣΫτͷঢ়ଶΛӅ͢͜ͱ 46
(Pʹ͓͚ΔHFUUFSTFUUFS (PʹࣗಈͰHFUUFSTFUUFSΛ࡞͢Δػೳͳ͍ɻ 1ZUIPO!QSPQFSUZ +BWB!%BUB MPNCPL (P-BOEʹ͋ΔΒ͍͠😆 47
ΧϓηϧԽͷྫ UJNF5JNFSߏମɺ͍͔ͭ͘ͷϑΟʔϧυʹΞΫηεͰ͖ΔߏମΛ ࣮͢Δ https://pkg.go.dev/time#Timer 48
ΧϓηϧԽͷྫ ඇਪ͕ͩɺ$Λमਖ਼͢Δ͜ͱͰ͖Δɻ ͨͩ͠ɺΠϕϯτΛड͚औΕͳ͘ͳΔ 49
HFUUFSTFUUFSͷϝϦοτ w ϑΟʔϧυͷऔಘઃఆʹؔ͢Δಈ࡞ΛΧϓηϧԽ͠ɺޙ͔Β ৽ͨͳػೳΛՃͰ͖ΔΑ͏ʹ͢Δɻ ϑΟʔϧυΛݕূͨ͠ ΓɺܭࢉʹΑΔΛฦͨ͠ΓɺϑΟʔϧυͷΞΫηεΛϛϡ ʔςοΫεͰอޢͨ͠Γͱ͍ͬͨػೳ w ෦දݱΛӅṭ͢Δ͜ͱͰެ։͢ΔͷΛॊೈʹมߋͰ͖Δɻ
w ࣮ߦ࣌ʹϓϩύςΟ͕มߋ͞Εͨ߹ͷσόοά༻ϒϨΠΫϙ ΠϯτΛఏڙ͠ɺσόοάΛ༰қʹ͢Δɻ 50
HFUUFSTFUUFSΛ͏ͱ͖ લํޓੑΛอূ͢ΔϢʔε έʔεͷՄೳੑ͕༧͞ΕΔ ͱ͖ʹ༗ޮ 51
HFUUFSTFUUFSΛ͏ͱ͖ w HFUUFSϝιουͷ໊લ#BMBODFʹ͢Δ ❌(FU#BMBODF w TFUUFSϝιουͷ໊લ4FU#BMBODFʹ͢Δ ߏମͷHFUUFS TFUUFS͕ԿͷՁͳ͍ͷͰ͋Ε͏͖Ͱͳ͍ɻ 52
HFUUFSTFUUFS͕͍ͬͺ͍🤮🤮🤮 53
5FMM %POU"TL ਘͶΔͳɺ໋͡Α ΧϓηϧԽͱɺgetter/setterΛ࣮͢Δ͜ͱͰ͋Δͱ͍ͬͨઆ໌͕ʑݟड͚ΒΕ·͢ɻ·ͨɺ։ൃπ ʔϧʹgetter/setterΛࣗಈ࣮͢ΔΧϓηϧԽͱݺΕΔػೳ͕͋Γ·͢ɻ͜ΕΒΧϓηϧԽͰͳ ͍ͱɺචऀओு͠·͢ɻgetter/setterΛ༰қ͢ΔͱΛউखʹग़͠ೖΕՄೳʹͳΓɺෆਖ਼ͷࠞೖॏ ෳίʔυͳͲɺڽूͷѱຐ͕ͨͪΕग़͠·͢ɻ͘͠ΈɺԿΒ͔ͷΛղܾ͢ΔͨΊʹଘࡏ͠· ͢ɻ͔͠͠ɺgetter/setterղܾͲ͜Ζ͔ͷݪҼʹͳ͍ͬͯ·͢ɻ ΧϓηϧԽͱσʔλͱͦͷσʔλΛૢ࡞͢ΔϩδοΫΛ1ͭͷΫϥεʹ·ͱΊɺඞཁͳखଓ͖ͷΈΛ֎ ෦ެ։͢Δ͜ͱͰ͢ɻΧϓηϧԽʹΑΓڽूߏΛࢭͰ͖·͢ɻෆਖ਼ঢ়ଶ͔Βද͢ΔόϦσʔ
γϣϯϩδοΫͳͲΛΧϓηϧԽ͢Δ͜ͱͰ҆શͳΠϯελϯεʹͳΓ·͢ɻ By ϛϊۦಈ ྑ͍ίʔυѱ͍ίʔυͰֶͿઃܭೖ ্ख͘ΧϓηϧԽͰ͖ͳ͍ཧ༝ Ϋιίʔυಈը 54
HFUUFSTFUUFSѱ͔ʁ TFUUFSѱ HFUUFS࣌ͱ߹ʹΑΔ ʲೖʳ݁ہgetter/setterѱͳͷ͔ ͏GetterʗSetterΛ͏ͷΊΑ͏ʢfeat. cleanCodeʣ ࢀߟจݙ 55
TFUUFSΘͣʹͲ͏͢Δʁ ίϯετϥΫλΛ͑ 56
TFUUFSΘͣʹͲ͏͢Δʁ ίϯετϥΫλΛ͑ (PʹίϯετϥΫλͳ͍ ❌ 57
TFUUFSΘͣʹͲ͏͢Δʁ ίϯετϥΫλΛ͑ (PʹίϯετϥΫλͳ͍ ❌ ϑΝΫτϦؔΛ͏ 58
ϑΝΫτϦؔ γϯϓϧͳྫ 59
ϑΝΫτϦؔ γϯϓϧͳྫ 60
ϑΝΫτϦؔ γϯϓϧͳྫ ϙΠϯλΛฦ͍͍ͯ͠ 61
5*1 ΠϯλʔϑΣΠε 62
ΠϯλʔϑΣΠεͱʁ 2VJ[ 63
ΠϯλʔϑΣΠεͱʁ JOUFSGBDF(P+BWBʹ͋Δ͕ɺ1ZUIPOͳͲʹ ଘࡏ͠ͳ͍ɻ ݴޠʹΑͬͯɺQSPUPDPMɺUSBJU ͱݺΕΔɻ 64
ΠϯλʔϑΣΠεͱʁ ΦϒδΣΫτͷৼΔ͍Λࢦఆ͢Δํ๏Λఏڙ͢ ΔɻෳͷΦϒδΣΫτ͕࣮Ͱ͖Δڞ௨ͷநԽ Λ࡞͢ΔͨΊʹ͏ɻ Goݴޠ100Tips 65
ΠϯλʔϑΣΠεͱʁ ΦϒδΣΫτͷૢ࡞ͷ໊લͱܕͷू·Γ 66
(PͷJOUFSGBDFWT+BWBͷJOUFSGBDF Ұ൪ͷҧ͍JNQMFNFOUTΛ໌͍ࣔͯ͠Δ͔Ͳ ͏͔ɻ+BWBJNQMFNFOUTΛ໌ࣔ͢Δɻ(P҉ తʹJOUFSGBDFΛ༻͢Δɻ 67
(PͷJOUFSGBDFWT+BWBͷJOUFSGBDF (P +BWB 68
(PͷJOUFSGBDFWT+BWBͷJOUFSGBDF (P +BWB 69
(PͷJOUFSGBDFWT+BWBͷJOUFSGBDF +BWBͰ*OUFSGBDF͕ࣗجఈ ͷܕͷΑ͏ʹѻΘΕΔ͜ͱͰͲ ͷΑ͏ͳΫϥεͰ͋Δ͔Λදݱ ͢Δɻ ˠJOUFSGBDFΛॻ͘͜ͱΛਪ ͞ΕΔ (PͷJOUFSGBDFຬ͖ͨ͢ৼ Δ͍Λఆٛ͠ɺͦͷৼΔ͍ Λຬ͔ͨ͢Ͳ͏͔Ͱ੍Λදݱ
͢Δɻ TUBUJDͳμοΫλΠϐϯ ά ˠաʹ͏ͷྑ͘ͳ͍ 70
(PͷJOUFSGBDFͷࢥ wநԽ࡞͢ΔͷͰͳ͘ɺ ൃݟ͢Δͷ w࠷ॳ͔ΒநԽΛ͍͚ͯ͠ͳ͍ ˠඞཁʹͳͬͨΒ࡞͢Δ 71
(PͷJOUFSGBDFͷࢥ “Don’t design with interfaces, discover them.” By Rob Pike
ΠϯλʔϑΣΠεͰઃܭ͢ΔͷͰͳ͘ɺΠ ϯλʔϑΣΠεΛൃݟ͢Δɻ 72
(PͷJOUFSGBDFͷҙ ΠϯλʔϑΣΠεΛհͯ͠ɺϝιουΛݺͼग़͢ͱɺੑೳ্ͷ Φʔόϔου͕ൃੜ͢Δ͜ͱ͋ΔɻΠϯλʔϑΣΠε͕ࢦ͢ ۩ܕΛݟ͚ͭΔͨΊʹɺϋογϡςʔϒϧͷσʔλߏΛݕ ࡧ͢Δඞཁ͕͋Δɻͨͩ͠ɺͦͷݕࡧͷΦʔόϔου࠷খͳ ͷͰɺଟ͘ͷঢ়گͰʹͳΔ͜ͱͳ͍ɻ ࢀߟ : GoͷInterfaceʹ͍ͭͯ 73
JOUFSGBDFΛ͏͜ͱͷϝϦοτ w࣮ͷΓସ͕͑ՄೳͱͳΔ wςετ͕༰қʹͳΔ wଟॏܧঝ͕Ͱ͖Δ 74
JOUFSGBDFΛ͏͜ͱͷσϝϦοτ wʹͳΔՄೳੑ͕͋Δ wਓʹΑͬͯशಘ͕͍͠ 75
JOUFSGBDF io.Writer io.Reader ιʔε͔ΒσʔλΛಡΈࠐΉ λʔήοτσʔλΛॻ͖ࠐΉ 76
JOUFSGBDFͷྫ 77
JOUFSGBDFͷྫ ϑΝΠϧͷ༰ΛผͷϑΝΠϧʹίϐʔ͢Δؔ Encrypt 78
JOUFSGBDFͷྫ ϑΝΠϧͷ༰ΛผͷϑΝΠϧʹίϐʔ͢Δؔ Encrypt 79
2VJ[ ࣮ࡍʹจࣈΛbase64ʹΤϯίʔυ͢ΔϓϩάϥϜΛ ࡞ͯ͠Έ͍ͯͩ͘͞ɻ 80
JOUFSGBDFΛΘͳ͍ྫ ҉߸ԽϓϩάϥϜ console͔Βͷඪ४ग़ྗΛ҉߸Խ͢ΔϓϩάϥϜ 81
JOUFSGBDFΛΘͳ͍ྫ ҉߸ԽϓϩάϥϜ ϑΝΠϧΛ҉߸Խ͢ΔϓϩάϥϜ SFBE#ZUF͕SFBE'JMF XSJUF#ZUF͕XSJUF'JMFʹͳͬͨͷͰ FODSZQU ࣗମमਖ਼͕ඞཁ 82
ํͱϨϕϧ ༨ஊ ιϑτΣΞγεςϜํΛࣔͨ͠ͷ ίϯϐϡʔλϓϩάϥϜೖྗΛग़ྗʹม͢ΔํΛৄࡉʹهड़ͨ͠ͷ ґଘੑͷํଓ͢ΔίϯϙʔωϯτͷϨϕϧͰܾ·ΔɻৗʹɺԼҐϨϕϧͷίϯϙʔωϯτ ্͕ҐϨϕϧͷίϯϙʔωϯτʹґଘ͢ΔΑ͏ʹઃܭ͢Δɻ 83
ํͱϨϕϧ ༨ஊ Ϩϕϧೖྗͱग़ྗ͔Βͷڑɻ ํ͕γεςϜͷೖྗͱग़ྗ͔ΒΕ͍ͯΕɺϨϕϧߴ͘ͳ Δɻೖྗͱग़ྗΛཧ͢Δํ͕γεςϜͷதͰ࠷ԼҐϨϕϧͷ ํɻ 84
ํͱϨϕϧ ༨ஊ σʔλϑϩʔͱιʔείʔυͷ ґଘੑɺඞͣ͠ಉ͡ํͱ ݶΒͳ͍ɻιʔείʔυͷґ ଘੑσʔλϑϩʔ͔ΒΓ ͠ɺϨϕϧͱ݁ͼ͚ͭΔ͖Ͱ ͋Δɻ 85
JOUFSGBDFΛͬͨྫ ҉߸ԽϓϩάϥϜ console͔Βͷඪ४ग़ྗΛ҉߸Խ͢ΔϓϩάϥϜ ґଘؔͷ͖Λinterfaceʹ͚Δ 86
JOUFSGBDFΛͬͨྫ ҉߸ԽϓϩάϥϜ console͔Βͷඪ४ग़ྗΛ҉߸Խ͢ΔϓϩάϥϜ https://go.dev/play/p/2g5dkUlu90a 87
JOUFSGBDFΛͬͨྫ ҉߸ԽϓϩάϥϜ File͔Βͷඪ४ग़ྗΛ҉߸Խ͢ΔϓϩάϥϜ 88
ํͱϨϕϧ ༨ஊ σʔλϑϩʔͱιʔείʔυͷ ґଘੑɺඞͣ͠ಉ͡ํͱ ݶΒͳ͍ɻιʔείʔυͷґ ଘੑσʔλϑϩʔ͔ΒΓ ͠ɺϨϕϧͱ݁ͼ͚ͭΔ͖Ͱ ͋Δɻ 89
(PͷJOUFSGBDFͷࢥ “The bigger the interface, the weaker the abstraction.” By
Rob Pike ΠϯλʔϑΣΠε͕େ͖͚Εେ͖͍΄Ͳ நԽऑ͘ͳΔ 90
JOUFSGBDFͷFNCFEEJOH JOUFSGBDFʹJOUFSGBDFΛFNCFE ͬͪ͜ͷํ͕ ݟ͍͢ʂ *ͱ+͕ඃΔͱ Τϥʔ 91
JOUFSGBDFͷ&NCFEEJOH 3FBE8SJUFͷྫ JOUFSGBDFʹJOUFSGBDFΛFNCFE 92
JOUFSGBDFͷ&NCFEEJOH 4USVDUʹJOUFSGBDFΛFNCFE 93
TUSVDUͷ&NCFEEJOH 4USVDUʹTUSVDUΛFNCFE 94
(Pͷ&NCFEEJOH w&NCFEEJOHܧঝͰͳ͍ ҕৡ wͷܕͷมʹੜܕͷೖͰ͖ͳ͍ wΦʔόϥΠυ͍ͯ͠ΔͷͰͳ͘ɺશ͘ಉ͡ϑΟʔϧυΛ Ճ͍ͯ͠Δ͚ͩ 95 (P७ਮͳ00ݴޠͰͳ͍
ܧঝΑΓҕৡ͕͍͍ཧ༝ ΦʔόϥΠυ͍ͯ͠ͳ͍ͷͰ ݩͷIPHFͷಈ࡞มΘΒͳ͍ #ͷIPHF ͱ"ͷIPHF ͭଘࡏ͢Δ ͠ΦʔόϥΠυͯ͠͠·͏ͱ ୯Ұͷݪଇʹ͢Δ߹ ॊೈʹมߋ͕Ͱ͖ͳ͍ 96
(Pͷ&NCFEEJOH ʹࢠΛೖ͠Α͏ͱ͢Δͱ ίϯύΠϧΤϥʔʹͳΓ·͢ɻ 97
(Pͷ&NCFEEJOH ༨ஊ 98 ʮΛࢠʹೖʯΤϥʔʹ ͳΓ·ͤΜɻͳͥͰ͠ΐ͏ɻ
(Pͷ&NCFEEJOH ༨ஊ 99 "θϩ͕ઃఆ͞ΕΔ͔Βɻ ࠨଆͷ࣮ߦ݁ՌzzͳͷͰɺԿද ࣔ͞Εͳ͍ https://go.dev/play/p/v9RV7aE99UH
JOUFSGBDFͷదͳཻ ࡉ͔͘͢Ε͢Δ΄Ͳɺ࠶ར༻ͷϨϕϧ͕ߴ͘ͳΓڧྗͳநԽͱͳΔɻ ͔͠͠ɺࡉ͔͍͚͗ͯ͘͢͠ͳ͍ɻ 100
JOUFSGBDF͍ͭ͏ʁ wڞ௨ͷৼΔ͍ w۩ମతͳ࣮ͱͷ wৼΔ͍ͷ੍ݶ 101
ڞ௨ͷৼΔ͍ TPSUύοέʔδͷJOUFSGBDF ιʔτͷʮฒΔʯͱ͍͏ৼΔ͍ΛநԽ͢Δ ιʔτͷछྨؾʹ͠ͳ͍ 102
ڞ௨ͷৼΔ͍ TPSUύοέʔδͷJOUFSGBDF 103
۩ମతͳ࣮ͷ ίʔυΛ۩ମతͳ࣮͔ΒΓ͢ நԽ͞ΕͨΠϯλʔϑΣΠεʹґଘ͞ ͤΔ͜ͱͰ۩ମͷΓସ͑Λ༰қʹ͢Δ Ϧείϑͷஔݪଇ 104
Ϧείϑͷஔݪଇ -41 -JTLPW4VCTUJUVUJPO1SJODJQMF φ(x) Λܕ T ͷΦϒδΣΫτ x ʹؔͯ͠ূ໌Մೳͳੑ࣭ͱ͢Δɻ͜ͷͱ͖ɺП(y)
ܕ T ͷαϒλΠϓ S ͷΦϒδΣΫτ y ʹ͍ͭͯਅͰͳ͚ΕͳΒͳ͍ɻ B. Liskov and J. WingɺA Behavioral Notion of Subtyping 105
Ϧείϑͷஔݪଇ -41 -JTLPW4VCTUJUVUJPO1SJODJQMF ʮαϒλΠϓʯͷΦϒδΣΫτผͷܕʢʮεʔύʔλΠϓʯʣͷΦϒδΣΫτͷ ͯ͢ͷৼΔ͍ͱɺߋʹผͷԿ͔Λඋ͑ͨͷͰ͋Δɻ ͜͜Ͱඞཁͱ͞ΕΔ ͷɺҎԼʹࣔ͢ஔͷੑ࣭ͷΑ͏ͳͷͩΖ͏ɿܕ S ͷ֤ΦϒδΣΫτ o1
ʹର ͠ɺܕTͷΦϒδΣΫτ o2 ͕ଘࡏ͠ɺT ʹؔͯ͠ఆٛ͞Εͨͯ͢ͷϓϩάϥϜ P ͕ o1 Λ o2 Ͱஔ͖͑ͯಈ࡞Λม͑ͳ͍߹ɺS T ͷαϒλΠϓͰ͋Δ B. LiskovɺData Abstraction and HierarchyɺLiskov 1988, p. 25, 3.3. Type Hierarchy 106
αϒλΠϓ ੜܕ ͱʁ αϒλΠϓ 4VCUZQF ͱɺJTBͷؔʹ͋Δͷɻ ΄ͱΜͲͷαϒλΠϓ4VCTUJUVBCMJUZ ަՄೳੑ Λ࣋ ͭɻ
ͭ·ΓɺαϒλΠϓ ੜܕ ʹґଘ͍͚ͯ͠ͳ͍ɻ αϒλΠϓɺੜͱͷํʹஔՄೳͰͳ͚Ε ͳΒͳ͍ɻ 107
Ϧείϑͷஔݪଇͷྫ int <: double (intܕdoubleܕͷੜܕ)ͷͱ ͖ɺintܕͷΦϒδΣΫτTΛdobuleܕʹஔ ͯ͠Կ͕ͳ͍͕ɺdoubleܕΛintܕͱ Έͳ͢ͷةݥɻ 108
Ϧείϑͷஔݪଇͷྫ int <: double (intܕdoubleܕͷੜܕ)ͷͱ ͖ɺintܕͷΦϒδΣΫτTΛdobuleܕʹஔ ͯ͠Կ͕ͳ͍͕ɺdoubleܕΛintܕͱ Έͳ͢ͷةݥɻ 109
Ͱ͖͍ͯͳ͍ྫ ۩ମతͳ࣮ʹ ґଘ͢Δ ݁߹ςετͰ MySQLΛىಈ͢Δ ඞཁ͕͋Δ 110
۩ମతͳ࣮ͷ 111 ετϨʔδͷநԽ
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 112 ্ҐϨϕϧͷํͷ࣮ίʔυɺԼҐϨϕϧ ͷৄࡉͷ࣮ίʔυʹґଘ͖͢Ͱͳ͘ɺٯʹ ৄࡉଆ͕ํʹґଘ͖͢Ͱ͋Δͱ͍͏ݪଇɻ
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 113 ࠷ॊೈͳγεςϜιʔείʔυͷґଘ͕ؔந ͚ͩΛࢀর͍ͯ͠Δ ˠ۩ʹґଘ͍͚ͯ͠ͳ͍ɻ ˠநΫϥεΠϯλʔϑΣΠεʹґଘ͢Δ
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 114 (PͰ1ZUIPOͷΫϥεͷΑ ͏ʹɺநϝιουͱ۩ϝ ιουΛͻͱͭͷTUSVDUͷத ʹఆٛ͢Δ͜ͱ͕Ͱ͖ͳ͍ ˠJOUFSGBDFΛ͏
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 115 ۩ʹઈରґଘ͍͚ͤͯ͞ͳ͍Θ͚Ͱͳ͍
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 116 ۩ʹઈରґଘ͍͚ͤͯ͞ͳ͍Θ͚Ͱͳ͍ มԽ͍͢͠۩ʹґଘ͍͚ͯ͠ͳ͍ ։ൃதͷϞδϡʔϧසൟʹมߋ͞Εଓ͚͍ͯΔϞδϡʔϧͳͲ
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 117 DMBTT"͕DMBTT#ʹґଘ͍ͯ͠Δ
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 118 #ͷJOUFSGBDFΛ࡞Γɺ" #ͷґଘํΛ#ͷJOUFSGBDFʹ͚Δ
ґଘؔٯసͷݪଇ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMF 119 Ϋϥε" #ͷJOUFSGBDFΛ"ͱΈͳ͢͜ͱͰ #Λ"ʹґଘͤ͞Δ͜ͱ͕Ͱ͖Δɻ
ґଘੑͷೖ %* 120 ͯ͞ӈͷίʔυͷTVN Ͳ͏ͬͯ ςετ͢ΔͰ͠ΐ͏͔ʁ https://go.dev/play/p/f458gJyZBdg
ґଘੑͷೖ %* 121 IPHF ͱGPP ͷฦ͕͢มΘͬͨΒ௵Ε·͢ TVN͕IPHF ͱGPP Λ͍ͬͯΔ͔ΒͰ͖Δςετ
ґଘੑͷೖ %* 122 ͪ͜ΒͷςετTVN͕IPHF ͱGPP Λ͍ͬͯ Δඞཁ͕͋Δɻ IPHF͕௵ΕΔͱ͜ͷςετࣦഊ͢Δ
ґଘੑͷೖ %* 123 ࠶એݴͳͷͰίϯύΠϧΤϥʔ
ґଘੑͷೖ %* 124 ࠨͷΑ͏ʹίʔυΛमਖ਼ͨ͠ΒͲ͏Ͱ͠ΐ͏͔ʁ
ґଘੑͷೖ %* 125 Ҿʹ͢Δ͜ͱͰTVNIPHF ͱGPP ΛΒͳ͘ ͯςετ͢Δ͜ͱ͕Ͱ͖Δ ͜ΕΛґଘੑͷೖͱ͍͏ɻ
ґଘੑͷೖ %* 126 repositoryʹґଘ͍ͯ͠Δ
ґଘੑͷೖ %* 127 repositoryʹґଘ͍ͯ͠Δ
ґଘੑͷೖ %* SFQPTJUPSZΛೖ͍ͯ͠Δ
ґଘੑͷೖ %*
͓·͚%*ίϯςφ TFSWJDFʹEPHͱDBUΛೖ͍ͯ͠Δ HPPHMFXJSFͷྫ
͓·͚%*ίϯςφ ࣗಈੜ mainؔ %*ίϯςφೖ͢ΔҾ͕ଟ͍࣌ʹศར HPPHMFXJSFͷྫ
ΠϯλʔϑΣΠεϑΝΫτϦ 5JQTͷϑΝΫτϦؔ γϯϓϧͳྫ ͷଓ͖ ϙΠϯλΛฦ͢ͷ͕׳ྫత 132
ΠϯλʔϑΣΠεϑΝΫτϦ 5JQTͷϑΝΫτϦؔ γϯϓϧͳྫ ͷଓ͖ 133
ΠϯλʔϑΣΠεϑΝΫτϦ RunͷςετΛ ͍ͨ͠ ൃలฤVTFDBTFͷςετ 134
ΠϯλʔϑΣΠεϑΝΫτϦ ςετγφϦΦ mockͨ͠repositoryͰusecase ͷΠϯελϯεΛ࡞ Assert RepositoryΛmockͯ͠ɺಠࣗͷrepositoryʹஔ͖͑Δ 135
ৼΔ͍ͷ੍ݶ ಈతͳઃఆΛѻ͏ͨΊʹΧελϜઃ ఆύοέʔδΛ࣮͢Δɻ ͜͜ͰɺઃఆΛऔಘ͠ɺߋ৽ͨ͠ ͘ͳ͍ͱ͢ΔɻಡΈऔΓઐ༻Ͱ͋Δ ͜ͱΛڧ੍͍ͨ͠ɻ 136
ৼΔ͍ͷ੍ݶ ಈతͳઃఆΛѻ͏ͨΊʹΧελϜઃ ఆύοέʔδΛ࣮͢Δɻ ͜͜ͰɺઃఆΛऔಘ͠ɺߋ৽ͨ͠ ͘ͳ͍ͱ͢ΔɻಡΈऔΓઐ༻Ͱ͋Δ ͜ͱΛڧ੍͍ͨ͠ɻ ઃఆͷऔಘ͚ͩʹৼΔ͍Λ ੍ݶ͢ΔநԽΛߦ͏ 137
ৼΔ͍ͷ੍ݶ JOU$PO fi H(FUUFSɺ/FX'PPϑΝΫ τϦؔʹೖ͞Ε͍ͯΔɻ JOU$PO fi HߏମJOU$PO fi H(FUUFSΛ
࣮͍ͯ͠ΔͷͰɺ/FX'PPϑΝΫτ ϦؔͷҾͱͯ͢͜͠ͱ͕Ͱ͖ɺ /FX'PPؔͷΫϥΠΞϯτʹӨڹ Λ༩͑ͳ͍ɻ #BSઃఆͷऔಘͷΈͰɺߋ৽Ͱ ͖ͳ͍ɻ 138
ৼΔ͍ͷ੍ݶ P.69࠶ܝ 139
2VJ[ μοΫλΠϐϯάͱʁ 140
μοΫλΠϐϯάͱʁ If it walks like a duck and quacks like
a duck, it must be a duck. by Dave Thomas ͦ͠Ε͕ΞώϧͷΑ͏ʹา͖ɺΞώϧͷΑ͏ʹ໐͘ͷͳΒɺͦΕΞώϧʹҧ͍ͳ͍ 141
μοΫλΠϐϯάͱʁ μοΫλΠϐϯάͱಈతܕ͚ݴޠͰ༻͍ΒΕΔ ܕ͚ͷελΠϧͰɺ FH3VCZ 1ZUIPO 142
μοΫλΠϐϯάͷϝϦοτ w μοΫλΠϐϯάݺͼग़͢ϝιου͑͞Λ͍࣋ͬͯΕ ͍͍ͷͰݺͼग़͠ଆܕͳͲͷલఏࣝෆཁͰ͋Δɻ w ॊೈੑɾ֦ுੑ͕ߴ͘ͳΔ w ґଘ͕গͳ͘ͳΔ 143
μοΫλΠϐϯάͷσϝϦοτ w ܕͷ߹ੑʹΑΔΤϥʔ͕ى͖͘͢ͳΓɺةݥੑ͕͏ 144
1ZUIPOͰμοΫλΠϐϯά #JSE#BSL Λ͍࣋ͬͯͳ͍ͷͰ BOJNBMͰͳ͍ఆʹͳΔɻ ͦΕҎ֎ಈͱΈͳ͞ΕΔɻ ͑Δݘ ͑ͳ͍ௗ ͑Δ ϩϘοτ 145
2VJ[ (PμοΫλΠϐϯάʁ ࣮ࡍʹ࣮͔ͯ֬͠Ί͍ͯͩ͘͞ɻ 146
(PͰμοΫλΠϐϯά Pythonͱಉ͡Α͏ʹৼΔ͍Λຬͨ͞ͳ͍bird͚͕ͩΤϥʔʹͳ Δɻ͜Ε͕Go͕Statick Duck TypingͱݺΕΔॴҎͰ͋Δɻ https://go.dev/play/p/5TD7PqRseEN 147