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の格言”Errors are values”の本質を読み解く
Search
H.Saki
April 23, 2024
10
2.6k
Goの格言”Errors are values”の本質を読み解く
24/4/23 Findy Goのエラーハンドリング 最新事情Lunch LTにて発表
https://findy.connpass.com/event/314417/
H.Saki
April 23, 2024
Tweet
Share
More Decks by H.Saki
See All by H.Saki
どうしてもcgoから逃げられなくなったあなたに知ってほしいcgoの使い方入門
sakiengineer
1
2.5k
アプリ側のコードを書いていた人がLambdaに触れて気づいたこと
sakiengineer
0
1.6k
epollによるNetwork I/O in Goランタイム
sakiengineer
3
2.1k
スケジューラから学ぶGoランタイム 〜code reading of runtime pkg〜
sakiengineer
12
4.8k
select文の内部実装見つけました
sakiengineer
1
750
Featured
See All Featured
Making Projects Easy
brettharned
116
6.2k
Build your cross-platform service in a week with App Engine
jlugia
230
18k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
13
840
Writing Fast Ruby
sferik
628
61k
Thoughts on Productivity
jonyablonski
69
4.6k
Automating Front-end Workflow
addyosmani
1370
200k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
The Invisible Side of Design
smashingmag
299
50k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
Transcript
Goの格言”Errors are values”の本質を読み解く さき(H.Saki) @saki_engineer Goのエラーハンドリング 最新事情Lunch LT APR 23
2024
自己紹介 About Me l ͖͞ )4BLJ ◦ ຊۀͰ"84Λओઓʹͨ͠ ΫϥυΠϯϑϥ͞ΜΛ͍ͯ͠·͢ ◦
5XJUUFS!TBLJ@FOHJOFFS l աڈͷՌ FUDʜ ;FOO ٕज़ॻయ ݄߸ʙ ݄߸
本日のテーマ Today’s Theme z&SSPSTBSFWBMVFTz ᴷᴷ (P1SPWFSCT 3PC1JLF
本日のテーマ Today’s Theme ΤϥʔͱͰ͋Δ
問 Question 2ͱԿ͔ʁ
答え Answer "7BMVFTDBOCFQSPHSBNNFE ϓϩάϥϜՄೳ
三段論法 Syllogism Τϥʔ ϓϩάϥϜՄೳ ˣ ΤϥʔϓϩάϥϜՄೳ
「プログラム可能」とは何か? meaning of the term “programmed” l ϓϩάϥϜͰɺมఆɾܕͱ͍ͬͨࣝผࢠͰ໊લ͕ͭ͘ͷΛѻ͍· ͢ ◦
(Pͷݴޠ༷ॻͰ͜ΕΒΛQSPHSBNFOUJUZͱݺΜͰ͍·͢ ▪ *EFOUJGJFSTOBNFQSPHSBNFOUJUJFTTVDIBTWBSJBCMFTBOEUZQFT l ϓϩάϥϜՄೳͰ͋ΔͱɺQSPHSBNFOUJUZͱͯ͠ѻ͏͜ͱ͕Ͱ͖Δͱಉٛ Ͱ͋Γɺ͢ͳΘͪҎԼͷಈ࡞͕Ͱ͖Δ͜ͱͰ͋ΔͱࠓճఆΊ·͢ ◦ ۩ମܕΠϯλʔϑΣʔεΛ༻͍ͯදݱ͢Δ ◦ ΛมɾఆʹόΠϯυ͢Δ
「エラーがプログラム可能」であるということ Errors can be programmed Τϥʔ͕ϓϩάϥϜՄೳͰ͋Δ͜ͱ QSPHSBNFOUJUZͱͯ͠ѻ͑Δ͜ͱɺҎ Լͷ͜ͱ͔Β֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ ۩ମܕΠϯλʔϑΣʔεΛ༻͍ͯදݱ͢Δ ΛมɾఆʹόΠϯυ͢Δ
• &SSPSΠϯλʔϑΣʔεΛຬͨ͢ߏମ Ͱ͋ΕͲΜͳ۩ମܕͰΤϥʔͱ͠ ͯѻ͏͜ͱ͕Մೳ • มFSSʹΤϥʔΛόΠϯυͯ͠ɺͦͷ FSSʹରͯࣗ͠ͷ͖ͳΑ͏ʹॲཧΛه ड़Ͱ͖Δ • ߏମͷϑΟʔϧυʹΤϥʔϑΟʔϧυ Λఆٛ͢Δ͜ͱͰΛόΠϯυ͢Δ
「エラーがプログラム可能」であるということ Errors can be programmed Τϥʔ͕ϓϩάϥϜՄೳͰ͋Δ͜ͱ QSPHSBNFOUJUZͱͯ͠ѻ͑Δ͜ͱɺҎ Լͷ͜ͱ͔Β֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ ۩ମܕΠϯλʔϑΣʔεΛ༻͍ͯදݱ͢Δ ΛมɾఆʹόΠϯυ͢Δ
• &SSPSΠϯλʔϑΣʔεΛຬͨ͢ߏମ Ͱ͋ΕͲΜͳ۩ମܕͰΤϥʔͱ͠ ͯѻ͏͜ͱ͕Մೳ • มFSSʹΤϥʔΛόΠϯυͯ͠ɺͦͷ FSSʹରͯࣗ͠ͷ͖ͳΑ͏ʹॲཧΛه ड़Ͱ͖Δ • ߏମͷϑΟʔϧυʹΤϥʔϑΟʔϧυ Λఆٛ͢Δ͜ͱͰΛόΠϯυ͢Δ ࠓ͜ͷྫΛͨ͘͞Μհ͠·͢
(余談) panicはプログラム可能ではない Panic cannot be programmed ΤϥʔͱΑ͘ൺֱͯ͠ޠΒΕΔQBOJDQSPHSBNFOUJUZͱΈͳͤͣɺϓϩά ϥϜՄೳͰ͋Δͱݴ͑·ͤΜɻ l QBOJDʮΰʔϧʔνϯΛऴྃͤͯ͞ݺͼग़͠ݩʹฦ͢ˠɾɾɾʯΛ܁Γฦ͠
ͯίʔϧελοΫΛר͖͢ऴྃγʔέϯεͷ͜ͱ ◦ 5IJTUFSNJOBUJPOTFRVFODFJTDBMMFEQBOJDLJOH CVJMUJOQBDLBHFͷ HPEPDΑΓ l ͜ͷऴྃγʔέϯεͷಈ࡞Λ։ൃऀࣗ༝ʹΧελϚΠζ͢Δ͜ͱͰ͖· ͤΜ ◦ SFDPWFSΛࠐΜͰελοΫר͖ΓΛࢭΊͯɺΰʔϧʔνϯͷॲཧΛ HSBDFGVMʹऴྃͤ͞Δ͙Β͍͔͠ଧͪख͕ͳ͍ l QBOJDͱ͍͏ࣄͦͷͷΛ۩ମܕΠϯλʔϑΣʔεΛ༻͍ͯදݱ͢Δͩͱ ͔ɺมɾఆʹόΠϯυ͢Δػೳͳ͍
bufio.Readerの場合 Examples 3FBEFSߏମͷ෦ʹFSSϑΟʔϧυΛอ͓͖࣋ͯ͠ɺʮFSS͕͋ΔͳΒಡΈࠐ ΈͤͣʹଈSFUVSO ͦ͏Ͱͳ͚ΕSFBEΛߦ͍݁ՌΛFSSϑΟʔϧυʹอଘʯͱ ͍͏ॲཧΛߦ͍ͬͯ·͢ɻ
bufio.Readerの場合 Examples 3FBEFSߏମͷ෦ʹFSSϑΟʔϧυΛอ͓͖࣋ͯ͠ɺʮFSS͕͋ΔͳΒಡΈࠐ ΈͤͣʹଈSFUVSO ͦ͏Ͱͳ͚ΕSFBEΛߦ͍݁ՌΛFSSϑΟʔϧυʹอଘʯͱ ͍͏ॲཧΛߦ͍ͬͯ·͢ɻ FSSϑΟʔϧυΛ༻ҙ ᶃFSSϑΟʔϧυʹΤϥʔ͕͢ Ͱʹ͋ΔͳΒಡΈࠐΈͤͣʹ ଈSFUVSO
ᶄ৽ͨʹಡΈࠐΈΛͨ͠߹ ͦͷ݁ՌΛFSSϑΟʔϧυʹ อଘ
bufio.Writerの場合 Examples CVGJP8SJUFSߏମCVGJP3FBEFSͱಉ༷ʹɺ෦ʹFSSϑΟʔϧυΛอ࣋ͯ͠ ͓͖ɺͦͷ༗ແʹΑͬͯXSJUFͷॲཧΛߦ͏͔Ͳ͏͔ذͤ͞ޮԽΛਤ͍ͬͯ ·͢ɻ FSSϑΟʔϧυΛ༻ҙ ᶃFSSϑΟʔϧυʹΤϥʔ͕ͳ ͍ͳΒॻ͖ࠐΈΛ܁Γฦ͢ ᶄΤϥʔ͕ൃੜͨ͠Βଈ SFUVSO
golang.org/x/sync/errgroupの場合 Examples HPMBOHPSHYTZODFSSHSPVQෳͷΰʔϧʔνϯͰฒߦॲཧΛߦͬͨͱ͖ͷ ΤϥʔॲཧΛαϙʔτ͢ΔϥΠϒϥϦͰ͢ɻ ᶃFSSHSPVQ(SPVQܕͷมΛఆٛ ᶄFSSPSHSPVQ(SPVQ(P ϝιουΛͬ ͯɺҾʹͨؔ͠Λฒߦॲཧͤ͞Δ ᶅFSSPSHSPVQ(SPVQ8BJU ϝιουΛ
ͬͯฒߦॲཧதʹൃੜͨ͠ΤϥʔΛอଓ
golang.org/x/sync/errgroupの場合 Examples લड़ͷॲཧΛ͢ΔͨΊʹɺ(SPVQߏମʹ༻ҙ͞ΕͨFSSϑΟʔϧυ͕େ͍ ʹཱ͍ͬͯ·͢ɻ FSSϑΟʔϧυΛ༻ҙ (PϝιουͰ࣮ߦͨ͠ॲཧͰΤϥ ʔ͕ൃੜͨ͠ΒFSSϑΟʔϧυʹอ ଘ 8BJU͕ݺΕͨΒFSSϑΟʔϧυ ʹอଘ͞Ε͍ͯͨΤϥʔΛฦ٫
gqlgenの場合 Examples HRMHFO(SBQI2-αʔόʔίʔυΛࣗಈੜͤ͞ΔπʔϧͰ͢ɻϨεϙϯεʹ ؚΊΔෳݸͷΤϥʔΛ͞·͟·ͳܗͰՃ͢Δ͜ͱ͕Ͱ͖·͢ɻ ᶃHSBQIRM"EE&SSPSؔͷ DBMMͰΤϥʔΛՃ ᶄϦκϧόϝιουͷΓʹΤϥ ʔΛฦ͢͜ͱͰΤϥʔΛՃ ϨεϙϯεʹFSSPSTϑΟʔϧυͱ͍ ͏ܗͰɺΤϥʔΛෳݸؚ·ͤΒΕΔ
gqlgenの場合 Examples ༷ʑͳखஈͰՃ͞ΕͨΤϥʔSFTQPOTF$POUFYUߏମͷதʹஷΊΒΕͯɺ Ϩεϙϯεੜ࣌ʹ(FU&SSPSTؔͰऔΓग़͠ར༻͢Δܗͱͳ͍ͬͯ·͢ɻ
gqlgenの場合 Examples ༷ʑͳखஈͰՃ͞ΕͨΤϥʔSFTQPOTF$POUFYUߏମͷதʹஷΊΒΕͯɺ Ϩεϙϯεੜ࣌ʹ(FU&SSPSTؔͰऔΓग़͠ར༻͢Δܗͱͳ͍ͬͯ·͢ɻ FSSPSTϑΟʔϧυΛ༻ҙ "EE&SSPS͞ΕΔͨͼʹɺ SFQTPOTF$POUFYUͷFSSPSTϑΟʔϧυʹ ཁૉΛՃ (FU&SSPST࣮ߦ࣌ʹɺSFQTPOTF$POUFYU ͷFSSPSTϑΟʔϧυʹஷ·ͬͨΤϥʔҰ
ཡΛऔಘ
まとめ Summary l ʮΤϥʔͰ͋ΔʯͱɺΤϥʔQSPHSBNFOUJUZͰ͋ΓҎԼͷૢ࡞͕Ͱ ͖Δͱ͍͏ҙຯ ◦ ۩ମܕΠϯλʔϑΣʔεΛ༻͍ͯදݱ͢Δ ◦ ΛมɾఆʹόΠϯυ͢Δ l
ΛมɾఆʹόΠϯυͯ͠ॲཧͱ͍͏ͱɺFSSEP4PNFUIJOH ͷΑ͏ ͳίʔυΛਅͬઌʹࢥ͍ු͔Δํ͕ଟ͍Ͱ͕͢ɺߏମͷϑΟʔϧυʹΤ ϥʔΛೖΕΔύλʔϯ͋Γ·͢ l ΤϥʔϑΟʔϧυʹΛอଘ͢Δɾηοτ͞Ε͍ͯΔʹΑͬͯϝιουͷ ڍಈΛม͑Δͱ͍͏Ҿ͖ग़͓͍࣋ͬͯͯ͠ଛͳ͍Ͱ͢
5IBOLZPVGPSMJTUFOJOH