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 Go SDK / MCP Go SDK
ktr_0731
3
530
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
440
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.4k
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
10k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
380
Go Modules and Proxy Walkthrough
ktr_0731
8
27k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
230
Fuzzy finder as a Go library
ktr_0731
3
6.1k
つよくてニューゲーム / NewGame++
ktr_0731
0
1.1k
Other Decks in Programming
See All in Programming
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.1k
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
2.2k
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
330
gunshi
kazupon
1
140
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
180
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
0
240
CSC307 Lecture 01
javiergs
PRO
0
680
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
1
380
CSC307 Lecture 03
javiergs
PRO
1
480
PC-6001でPSG曲を鳴らすまでを全部NetBSD上の Makefile に押し込んでみた / osc2025hiroshima
tsutsui
0
210
從冷知識到漏洞,你不懂的 Web,駭客懂 - Huli @ WebConf Taiwan 2025
aszx87410
2
3.4k
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
430
Designing for humans not robots
tammielis
254
26k
My Coaching Mixtape
mlcsv
0
29
Navigating Weather and Climate Data
rabernat
0
72
4 Signs Your Business is Dying
shpigford
187
22k
Rails Girls Zürich Keynote
gr2m
96
14k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
76
Music & Morning Musume
bryan
46
7k
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ͱͯ͠ެ։͢ΔͨΊʹ