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
6
1.4k
Designing libraries in Go way
ktr
March 10, 2021
Tweet
Share
More Decks by ktr
See All by ktr
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
0
23
Go Modules and Proxy Walkthrough
ktr_0731
8
26k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
170
Fuzzy finder as a Go library
ktr_0731
3
5.5k
つよくてニューゲーム / NewGame++
ktr_0731
0
910
やはり俺の Go アプリケーション設計はまちがっている。 / My Go Application Design Is Wrong, As I Expected
ktr_0731
13
3.4k
GopherCon2018
ktr_0731
2
1.7k
Evans: more expressive gRPC client
ktr_0731
2
440
自作 CLI ツールのワークフローとそれを支える技術 / the workflow of my CLI tool and technologies which supports it
ktr_0731
0
1.7k
Other Decks in Programming
See All in Programming
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
1
410
英語
s_shimotori
1
220
Rust.Nagoya #1
codemountains
0
170
コード生成を伴うLLMエージェント - 2024.07.18 Tokyo AI
smiyawaki0820
11
4.1k
CSC307 Lecture 08
javiergs
PRO
0
330
Mastering Developer Experience: A Roadmap for Success 【開発生産性Conference 2024】
findyinc
1
380
OpenAI/Gemini APIを使って EPUBを翻訳するCLIツールをつくってみた
tomiyan
0
790
SRE チーム立ち上げ前に考えたこと・取り組んだこと / Considerations and Preparations Before Establishing an SRE Team
mackey0225
3
320
初心者がおさえておきたいAWS CDKのベストプラクティス 2024
konokenj
15
7.3k
AWS初心者ってどうやってAWSを学ぶ?〜アプリエンジニアがやってよかったアーキテクチャ学習方法〜
yamanashi_ren01
0
190
継続的な活動で築く地方エンジニアの道
myamashii
2
350
CSC307 Lecture 10
javiergs
PRO
0
310
Featured
See All Featured
The Invisible Customer
myddelton
117
13k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
360
22k
10 Git Anti Patterns You Should be Aware of
lemiorhan
652
58k
What the flash - Photography Introduction
edds
65
11k
Faster Mobile Websites
deanohume
303
30k
Large-scale JavaScript Application Architecture
addyosmani
506
110k
How GitHub Uses GitHub to Build GitHub
holman
471
290k
Principles of Awesome APIs and How to Build Them.
keavy
124
16k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
36
9.1k
Statistics for Hackers
jakevdp
792
220k
Testing 201, or: Great Expectations
jmmastey
33
6.9k
YesSQL, Process and Tooling at Scale
rocio
166
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ͱͯ͠ެ։͢ΔͨΊʹ