Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Designing libraries in Go way
Search
ktr
March 10, 2021
Programming
1.6k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Designing libraries in Go way
ktr
March 10, 2021
More Decks by ktr
See All by ktr
詳解 MCP Go SDK / MCP Go SDK
ktr_0731
3
690
あまり知られていない MCP 仕様たち / MCP specifications that aren’t widely known
ktr_0731
0
660
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.7k
激動の一年を通じて見えてきた「技術でリードする」ということ
ktr_0731
8
11k
Monorepo における Go テストの差分実行 / Running Differential Go Tests in a Monorepo
ktr_0731
1
480
Go Modules and Proxy Walkthrough
ktr_0731
8
27k
ソフトウェアの複雑さに立ち向かう技術 / Tackling software complexity
ktr_0731
0
250
Fuzzy finder as a Go library
ktr_0731
3
6.4k
つよくてニューゲーム / NewGame++
ktr_0731
0
1.1k
Other Decks in Programming
See All in Programming
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
Event is what happens
moro
2
770
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
golang-bob.pdf
iwatsukayura
0
130
APNsからLive Activityを開始する話
yumnumm
0
170
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
0
880
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
210
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
The Curse of the Amulet
leimatthew05
3
16k
Making the Leap to Tech Lead
cromwellryan
135
10k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Producing Creativity
orderedlist
PRO
348
41k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
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ͱͯ͠ެ։͢ΔͨΊʹ