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
Designing libraries in Go way
Search
ktr
March 10, 2021
Programming
7
1.5k
Designing libraries in Go way
ktr
March 10, 2021
Tweet
Share
More Decks by ktr
See All by ktr
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
9.4k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
190
Go Modules and Proxy Walkthrough
ktr_0731
8
27k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
210
Fuzzy finder as a Go library
ktr_0731
3
5.9k
つよくてニューゲーム / NewGame++
ktr_0731
0
1k
やはり俺の Go アプリケーション設計はまちがっている。 / My Go Application Design Is Wrong, As I Expected
ktr_0731
13
3.6k
GopherCon2018
ktr_0731
2
1.8k
Evans: more expressive gRPC client
ktr_0731
2
510
Other Decks in Programming
See All in Programming
ReadMoreTextView
fornewid
1
460
エラーって何種類あるの?
kajitack
5
290
データの民主化を支える、透明性のあるデータ利活用への挑戦 2025-06-25 Database Engineering Meetup#7
y_ken
0
310
Webの外へ飛び出せ NativePHPが切り拓くPHPの未来
takuyakatsusa
2
320
PHPで始める振る舞い駆動開発(Behaviour-Driven Development)
ohmori_yusuke
2
170
Team operations that are not burdened by SRE
kazatohiei
1
180
A2A プロトコルを試してみる
azukiazusa1
2
1.1k
Claude Codeの使い方
ttnyt8701
1
130
C++20 射影変換
faithandbrave
0
520
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
1
660
なんとなくわかった気になるブロックテーマ入門/contents.nagoya 2025 6.28
chiilog
1
190
Azure AI Foundryではじめてのマルチエージェントワークフロー
seosoft
0
120
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
16
940
Measuring & Analyzing Core Web Vitals
bluesmoon
7
490
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
Making the Leap to Tech Lead
cromwellryan
134
9.3k
It's Worth the Effort
3n
185
28k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
Code Reviewing Like a Champion
maltzj
524
40k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Agile that works and the tools we love
rasmusluckow
329
21k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Transcript
at Gopherಓ ಉ૭ձ2021 Go Β͍͠ϥΠϒϥϦΛ ͭ͘ΔͨΊʹߟ͑Δ͜ͱ
LUS !LUS@!LUS .FSQBZ$PEFQBZNFOU5FBN #BDLFOE XIPBNJ
at Gopherಓ ಉ૭ձ2021 Go Β͍͠ϥΠϒϥϦΛ ͭ͘ΔͨΊʹߟ͑Δ͜ͱ
w ͰͲ͏͢Εʜʁ w (PΒ͍͠ॻ͖ํɺϦϙδτϦͷઃఆɺͷํʜ w ϦϙδτϦʹΑͬͯ͞·͟· (PϥΠϒϥϦΛެ։͍ͨ͠ʂ
(PQIFS͔Βݟͯɺ ͲΜͳϥΠϒϥϦͩͱخ͍͠ͷ͔ΛΫϦΞʹ͢Δ ͜ͷτʔΫͰ͍͑ͨ͜ͱ
(PQIFS͔Βݟͯɺ ͲΜͳ044ͩͱخ͍͠ͷ͔ΛΫϦΞʹ͢Δ ͜ͷτʔΫͰ͍͑ͨ͜ͱ ࣮ࡍʹ044Λग़͢ࡍͷ໎͍Λখ͘͢͞Δʂ
w $-*πʔϧݻ༗ͷϓϥΫςΟε w ಛఆͷϥΠϒϥϦϑϨʔϜϫʔΫͷ۷ΓԼ͛ ͜ͷτʔΫͰѻΘͳ͍͜ͱ
ϥΠϒϥϦઃܭͰؾΛ͚͍ͭͯΔ͜ͱ 044ͱͯ͠ެ։͢ΔͨΊʹ ·ͱΊ ࣍
ϥΠϒϥϦઃܭͰؾΛ͚͍ͭͯΔ͜ͱ
Τϥʔ
w αʔυύʔςΟͷΤϥʔϥΠϒϥϦYFSSPST ͔ͭΘͳ͍ w ϥΠϒϥϦͷϢʔβʹͦͷΤϥʔϥΠϒϥϦͷ ༻Λڧ੍ͤͯ͞͠·͏ͨΊ Ͱ͖ΔݶΓඪ४ΤϥʔͷΈΛ͔ͭ͏
w Ͱ͖ΔݶΓerrorsύοέʔδͷ"1*ͱޓੑ Λ࣋ͭͷΛબͿ w errors.Asɺerrors.Isɺerrors.Unwrap ඪ४ΤϥʔҎ֎Λ͔ͭ͏߹
$POUFYU
w DPOUFYUΩϟϯηϧػߏΛநԽͨ͠ͷ w ࣮ߦʹ͍͕͔͔࣌ؒΔՄೳੑͷ͋Δͷ DPOUFYUΛαϙʔτ͖͢ $POUFYUBXBSF
ྫLUSBQJHFO
w (PϥΠϒϥϦ w DVSMίϚϯυΛ࣮ߦͨ݁͠Ռ͔Β(P"1*ΫϥΠΞϯτ Λࣗಈੜ͢Δ LUSBQJHFO
$ curl https://api.github.com/repos/ktr0731/apigen { "id": 312020626, "node_id": "MDEwOlJlcG9zaXRvcnkzMTIwMjA2MjY=", "name": "apigen",
"full_name": "ktr0731/apigen", "private": false, "owner": { "login": "ktr0731", "id": 12953836, "node_id": "MDQ6VXNlcjEyOTUzODM2", …
None
None
w ෦Ͱ"1*ϦΫΤετΛߦ͍ͬͯΔͨΊ w ͙͢ʹ݁Ռ͕ฦͬͯ͘ΔͱݶΒͳ͍ w DPOUFYUΛड͚औΔ͜ͱͰ্ҐϨΠϠʔʹΩϟϯηϧɾ λΠϜΞτͷΈΛఏڙͰ͖Δ ͳͥDPOUFYUBXBSFͳؔͳͷ͔ʁ
Φϓγϣϯ
w ߏମ w GVODUJPOBMPQUJPOQBUUFSO Φϓγϣϯ
w $PNNBOEܕͷϑΟʔϧυͰΦϓγϣϯΛड͚Δ w TQGDPCSB
w ؔͱՄมҾͷΈ߹ΘͤͰΦϓγϣϯΛදݱ w ΦϓγϣϯܕΛΤΫεϙʔτ͢Δඞཁ͕ͳ͍ w ؆ܿͰ໌շͳهड़ʹͳΔ GVODUJPOBMPQUJPOQBUUFSO
LUSBQJHFO
LUSBQJHFO
LUSBQJHFO
w ҰҰ w Φϓγϣϯ͕ଟ͍߹ɺߏମͷ΄͏͕ݟ௨͕͠ྑ͍ w (PGNU͕ϑΟʔϧυΛଗ͑ͯ͘ΕΔ w ͦΕҎ֎GVODUJPOBMPQUJPOQBUUFSO͕ྑͦ͞͏ ߏମWTGVODUJPOBMPQUJPOQBUUFSO
w Φϓγϣϯ༷ͷҰ෦ w ૿ͨ͢ͼʹϥΠϒϥϦͷෳࡶੑ͕૿͢ w ඞཁ࠷ݶʹอͭ ΦϓγϣϯΛ૿͗͢͠ͳ͍
ྫ"1*ΫϥΠΞϯτͷϦτϥΠ
None
ϦτϥΠʹؔ͢ΔΦϓγϣϯ͕ ͨ͘͞Μ͋ͬͯෳࡶʜ🤔
Φϓγϣϯ͕Ұ͚ͭͩʹͳͬͯ Θ͔Γ͘͢ͳͬͨ☺
DFOLBMUJCBDLP⒎ʹґଘͯ͠͠·͍ͬͯΔ😨
w )551ϦΫΤετʹࣦഊͨ͠ͱ͖ʹҰఆ࣌ؒͪɺ ࠶ϦΫΤετΛ͛Δ ϦτϥΠʹ͍ͭͯ͏Ұਂ͘ߟ͑Δ
w )551ϦΫΤετʹࣦഊͨ͠ͱ͖ʹҰఆ࣌ؒͪɺ ࠶ϦΫΤετΛ͛Δ w ϦτϥΠ)551ϦΫΤετͷͨΊʹ͔͠ΘΕͳ͍ ϦτϥΠʹ͍ͭͯ͏Ұਂ͘ߟ͑Δ
w )551ϦΫΤετʹࣦഊͨ͠ͱ͖ʹҰఆ࣌ؒͪɺ ࠶ϦΫΤετΛ͛Δ w ϦτϥΠ)551ϦΫΤετͷͨΊʹ͔͠ΘΕͳ͍ w )551ΫϥΠΞϯτͰ࣮Ͱ͖ΔͷͰʜʁ ϦτϥΠʹ͍ͭͯ͏Ұਂ͘ߟ͑Δ
w )551ϦΫΤετʹࣦഊͨ͠ͱ͖ʹҰఆ࣌ؒͪɺ ࠶ϦΫΤετΛ͛Δ w ϦτϥΠ)551ϦΫΤετͷͨΊʹ͔͠ΘΕͳ͍ w )551ΫϥΠΞϯτͰ࣮Ͱ͖ΔͷͰʜʁ w ͦͦϦτϥΠʹؔͯ͜͠ͷϥΠϒϥϦͰߟ͑Δඞཁ͋Δʜʁ ϦτϥΠʹ͍ͭͯ͏Ұਂ͘ߟ͑Δ
w ґଘ͕ඪ४ύοέʔδ͚ͩʹͳΔ w ϦτϥΠʹ·ͭΘΔؔ৺ࣄΛͰ͖Δ w ϢʔβҙͷϦτϥΠ࣮ΛબΔ w τϨʔεϩΨʔͳͲΛࠐΈ͍ͨ߹ͰϥΠϒϥϦͷ Φϓγϣϯ͕૿͑ͳ͍ʂ )551ΫϥΠΞϯτΛड͚औΔϝϦοτ
)551ΫϥΠΞϯτΛड͚औΔΑ͏ʹͯ͠ΈΔ
None
ϢʔβIBTIJDPSQHPSFUSZBCMFIUUQͰϦτϥΠΛߦ͏
None
(PΒ͍͠ΠϯλʔϑΣʔεΛ ఏڙ͢Δ
w ඪ४ɾ४ඪ४ύοέʔδ͕͓खຊ w ޙํޓੑͷͨΊʹʹͳ͍ͬͯΔՕॴ ͪΖΜ͋ΔͷͰҙ (PΒ͍͠ΠϯλʔϑΣʔεΛఏڙ͢Δ
ྫLUSBQJHFO
w DVSMίϚϯυ w ੜ͢ΔϑΝΠϧͷύοέʔδ໊ w ੜ͢Δϝιου໊ w ϝιουͷύϥϝʔλ໊ w FUD
BQJHFOͷೖྗ
ίϚϯυϥΠϯʜʁ $ apigen --package api --out api_gen.go \ "curl example.com/post"
"GetPost" \ "curl -d "{...}" example.com/posts" "CreatePost"
ίϚϯυϥΠϯʜʁ $ apigen --package api --out api_gen.go \ "curl example.com/post"
"GetPost" \ "curl -d "{...}" example.com/posts" "CreatePost" ੜର"1*͕૿͑ΔͨͼʹҾ͕૿͑Δ🤔 ҉తʹʮDVSMίϚϯυʯʮϝιου໊ʯͷϖΞΛཁٻ͍ͯͯ͠ײతͰͳ͍ʜ
֎෦ϑΝΠϧʜʁ $ apigen --package api --out api_gen.go definition.yaml
֎෦ϑΝΠϧʜʁ $ apigen --package api --out api_gen.go definition.yaml ࣮ߦ࣌ʹ͔͠ଥੑ͕ݕূͰ͖ͳ͍ͷͰ͍ͮΒ͍🤔
w DVSMίϚϯυΛ࣮ߦͨ݁͠Ռ͔Β(P"1*ΫϥΠΞϯτ Λࣗಈੜ͢Δ BQJHFOͷఆϢʔβΛࢥ͍ग़͢
w DVSMίϚϯυΛ࣮ߦͨ݁͠Ռ͔Β(P"1*ΫϥΠΞϯτ Λࣗಈੜ͢Δ BQJHFOͷఆϢʔβΛࢥ͍ग़͢
w DVSMίϚϯυΛ࣮ߦͨ݁͠Ռ͔Β(P"1*ΫϥΠΞϯτ Λࣗಈੜ͢Δ w Ϣʔβ(PͰ։ൃΛ͍ͯ͠Δ͜ͱΛલఏʹͰ͖Δ w (PΛ͏·ͬͨ͘ྑ͍ղܾࡦ͕͋Γͦ͏ʜ BQJHFOͷఆϢʔβΛࢥ͍ग़͢
w ४ඪ४ύοέʔδͷBOBMZTJTΛར༻ w BOBMZTJT"OBMZ[FSΛड͚औ͍ͬͯΔ HPWFUͷ࣮
w ϑΟʔϧυͰ͞·͟·ͳઃఆΛ ߦ͍ͬͯΔ BOBMZTJT"OBMZ[FS
w ϑΟʔϧυͰ͞·͟·ͳઃఆΛ ߦ͍ͬͯΔ BOBMZTJT"OBMZ[FS
w BOBMZTJTύοέʔδͷΑ͏ʹઃఆΛߦ͏ܕΛ ఆٛ͠ɺΤϯτϦϙΠϯτؔ͢ ྑͦ͞͏ͳղܾࡦ
None
"1*ఆٛΛߦ͏
ίʔυੜʂ
None
w ੩తܕ͚͞ΕͨίʔυδΣωϨʔλ w "1*ఆٛΛॻ͍ͯapigen.Generate͚ͩ͢ w ΦϓγϣϯͰio.WriterΛड͚औͬͨΓ͢Δ͜ͱՄೳʂ ސ٬͕ຊʹཉ͔ͬͨ͠ͷ
ྫLUSHPGV[[ZpOEFS
w (PϥΠϒϥϦ w G[GͷΑ͏ͳGV[[ZpOEFSΛ(P$-*πʔϧ ʹΈࠐΊΔ LUSHPGV[[ZpOEFS
None
֤ީิΛදࣔ͢ΔͨΊʹʜ🤔
ಠࣗܕͰީิΛͯ͠Β͏ʁ
Ϣʔβຖճ[]*CandidateΛͭ͘Βͳ͍ͱ ͍͚ͳ͍ͷͰ͋·Γ͍উख͕ྑ͘ͳ͍ʜ
w δΣωϦΫε ·ͩ ͳ͍ ҙͷܕͷεϥΠεΛѻ͏ʹʜʁ
w δΣωϦΫε ·ͩ ͳ͍ w ඪ४ύοέʔδʹҙͷܕͷεϥΠεΛѻ͍ͬͯ Δ͕ؔ͋ͬͨΑ͏ͳʜʁ ҙͷܕͷεϥΠεΛѻ͏ʹʜʁ
TPSU4MJDF
None
None
εϥΠεͷܕʹؔ༩ͤͣɺީิJͷλΠτϧΛ ܾఆ͢ΔͨΊͷؔΛड͚औΔΑ͏ʹ
εϥΠεͰ͋ΕͳΜͰͤΔΑ͏ʹʂ
None
044ͱͯ͠ެ։͢ΔͨΊʹ
w (JU)VC͕ެ։͍ͯ͠Δ044ͷΨΠυ w 044ͷ8)"58):ɺߩݙํ๏ɺϓϩδΣΫτͷ ্ཱͪ͛ํͳͲΛཏ͍ͯ͠Δ w ୯७ʹಡΈͱ͓ͯ͠͠Ζ͍ 0QFO4PVSDF(VJEFTΛಡΉ
https://opensource.guide/ja/starting-a-project/
w ϓϩδΣΫτͷґଘཧͷͨΊ w όʔδϣϯཧ͞ΕͨϞδϡʔϧͱͯ͠ఏڙ͢ΔͨΊ (PNPEVMFTʹରԠ͢Δ
$ go mod init && go mod tidy (PNPEVMFTʹରԠ͢Δ
$ go mod init && go mod tidy (PNPEVMFTʹରԠ͢Δ ˞λά͚ʹ͍ͭͯޙड़
w ࣗͷ044͕ґଘ͍ͯ͠ΔϞδϡʔϧͷ ϥΠηϯεදه͖͢ w 4POHNVHPDSFEJUT͕ΜΓ ґଘϞδϡʔϧͷϥΠηϯεදه
$ gocredits -w . ґଘϞδϡʔϧͷϥΠηϯεදه
w (PNPEVMFTͰMJOUFSͳͲͷπʔϧ܈ཧ͢Δ w Ϗϧυςετͷ࠶ݱੑΛͨͤΔͨΊ (Pπʔϧͷґଘཧ
https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module
w (JUλάΛͬͯQVTI͢Ε৽͍͠Ϟδϡʔϧ ͱͯ͠ೝࣝ͞ΕΔ ϥΠϒϥϦͷ
w (P3FMFBTFSΛ͔ͭ͏ͱΑΓྑ͍͔ w (JU)VC3FMFBTFTͷ࡞ɺ$IBOHFMPHͷ࡞Λ Α͠ͳʹͬͯ͘ΕΔ ϥΠϒϥϦͷ
$ cat .goreleaser.yaml builds: - skip: true $ git tag
v0.1.0 main $ goreleaser ϥΠϒϥϦͷ
w 044ͱͯ͠ग़͢ϥΠϒϥϦϢʔβͷͨΊʹ υΩϡϝϯτΛॻ͖͘ υΩϡϝϯτ
w ϢʔβͷࢹͰυΩϡϝϯτΛಡΊΔ w (P%PD͚ͩͰ͍ํ͕ཧղͰ͖Δ͔ʁ w ެ։͢Δඞཁͷͳ͍ͷͳ͍͔ʁ w ༷ͷ࿙Εͳ͍͔ʁ (P%PDΛͬͨυΩϡϝϯτͷચ࿅
w ਓʑυΩϡϝϯτΛಡ·ͳ͍ w &YBNQMFςετ͕͋ΕɺͦͷϥΠϒϥϦͷ࣭ ͕͋ΔఔΘ͔Δ &YBNQMFςετΛ༻ҙ͢Δ
None
w &YBNQMFςετΑΓෳࡶͳ༻ྫΛஔ͍͓ͯ͘ @FYBNQMFσΟϨΫτϦ
w @͔Β࢝·ΔϑΝΠϧɾσΟϨΫτϦ ͓ΑͼUFTUEBUBͱ͍͏σΟϨΫτϦ (Pπʔϧ͔Βແࢹ͞ΕΔ w @FYBNQMFͱ͍͏໋໊׳श ಛघͳϑΝΠϧ໊ɾσΟϨΫτϦ໊ https://golang.org/cmd/go/#hdr-Package_lists_and_patterns
·ͱΊ
w αʔυύʔςΟͷґଘΛগͳ͘ɾখ͘͞อͭ w ༷Λগͳ͘ɾখ͘͞อͭ w DPOUFYUΛͪΌΜͱαϙʔτ͢Δ w (PΒ͍͠ΠϯλʔϑΣʔεΛఏڙ͢Δ w ඪ४ɾ४ඪ४ύοέʔδ͕ͱͯࢀߟʹͳΔ
ϥΠϒϥϦઃܭͰؾΛ͚͍ͭͯΔ͜ͱ
w 0QFO4PVSDF(VJEFTΛಡΜͰ͓͘ͱྑ͍͔ w (PNPEVMFTͰϥΠϒϥϦͷόʔδϣϯཧΛ͠Α͏ w υΩϡϝϯτ͕Μͬͯॻ͜͏ w ࣗϒϥογϡΞοϓલʹॻ͘͜ͱ͕ଟ͍ 044ͱͯ͠ެ։͢ΔͨΊʹ