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.6k
Designing libraries in Go way
ktr
March 10, 2021
Tweet
Share
More Decks by ktr
See All by ktr
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
360
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.3k
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
9.9k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
310
Go Modules and Proxy Walkthrough
ktr_0731
8
27k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
220
Fuzzy finder as a Go library
ktr_0731
3
6.1k
つよくてニューゲーム / NewGame++
ktr_0731
0
1k
やはり俺の Go アプリケーション設計はまちがっている。 / My Go Application Design Is Wrong, As I Expected
ktr_0731
13
3.7k
Other Decks in Programming
See All in Programming
iOSエンジニア向けの英語学習アプリを作る!
yukawashouhei
0
200
EMこそClaude Codeでコード調査しよう
shibayu36
0
240
Domain-centric? Why Hexagonal, Onion, and Clean Architecture Are Answers to the Wrong Question
olivergierke
3
930
技術的負債の正体を知って向き合う
irof
0
200
CSC305 Lecture 06
javiergs
PRO
0
250
釣り地図SNSにおける有料機能の実装
nokonoko1203
0
190
なぜあの開発者はDevRelに伴走し続けるのか / Why Does That Developer Keep Running Alongside DevRel?
nrslib
3
410
Leading Effective Engineering Teams in the AI Era
addyosmani
7
500
スマホから Youtube Shortsを見られないようにする
lemolatoon
27
33k
(Extension DC 2025) Actor境界を越える技術
teamhimeh
1
270
bootcamp2025_バックエンド研修_WebAPIサーバ作成.pdf
geniee_inc
0
120
Go Conference 2025: Goで体感するMultipath TCP ― Go 1.24 時代の MPTCP Listener を理解する
takehaya
9
1.7k
Featured
See All Featured
Side Projects
sachag
455
43k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
How GitHub (no longer) Works
holman
315
140k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
Mobile First: as difficult as doing things right
swwweet
225
10k
Build your cross-platform service in a week with App Engine
jlugia
232
18k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
190
55k
The Illustrated Children's Guide to Kubernetes
chrisshort
49
51k
Thoughts on Productivity
jonyablonski
70
4.9k
4 Signs Your Business is Dying
shpigford
185
22k
Rails Girls Zürich Keynote
gr2m
95
14k
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ͱͯ͠ެ։͢ΔͨΊʹ