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
Gunosy APIチームGo開発フロー
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kyokomi
March 11, 2015
Technology
6.3k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Gunosy APIチームGo開発フロー
Gunosy.go#11の発表内容です
kyokomi
March 11, 2015
More Decks by kyokomi
See All by kyokomi
goaを導入した話
kyokomi
0
2.6k
さくっとGAE/GoでAPIを作って本番環境にリリースする / gaego-api-init-release
kyokomi
0
4.1k
Go言語で作られたAPIのレガシーコードと戦った話 / Go Conference 2015 winter
kyokomi
4
4k
Go製の拡張可能なSlack bot
kyokomi
3
8.5k
go generate tips
kyokomi
4
3.5k
私がGo言語を選んだ理由
kyokomi
3
420
Gomaについて
kyokomi
4
3.2k
Other Decks in Technology
See All in Technology
TypeScript入門 2026
recruitengineers
PRO
3
500
関東Kaggler会発表資料
takoi
1
200
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
1
370
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
1
1.6k
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
6
1.4k
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
480
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
19k
AI ネイティブな組織に Gemini Enterprise Agent Platform がなぜ必要なのか
asei
1
190
【Google Cloud Next Tokyo'26】Gemini Enterprise と Oracle AI Database で実現する、業務データ活用を実現する AI エージェント実装
shisyu_gaku
0
230
Invisible to AI? Making TYPO3 Sites Quotable by AI Search Systems
wolfgangwagner
0
170
ホームラボ紹介
y_sera15
0
130
GitHub CopilotのFinOps- AI CreditのObservabilityと価値を生むためのエージェント設計
yuriemori
0
140
Featured
See All Featured
For a Future-Friendly Web
brad_frost
183
10k
GraphQLとの向き合い方2022年版
quramy
50
15k
A designer walks into a library…
pauljervisheath
211
24k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
660
Skip the Path - Find Your Career Trail
mkilby
1
180
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
250
Balancing Empowerment & Direction
lara
6
1.2k
How to build a perfect <img>
jonoalderson
1
5.9k
From π to Pie charts
rasagy
0
260
Deep Space Network (abreviated)
tonyrice
0
250
YesSQL, Process and Tooling at Scale
rocio
174
15k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Transcript
Gunosy'APIνʔϜ Go։ൃϑϩʔ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 1
ࣗݾհ • Twi%er:)@k_yokomi)ʢ͖ΐ͜Έʣ※1 • 20151݄ʹGunosyస৬ • GoΤϯδχΞͬͯ·͢ • Ҏલɺौ୩ͷήʔϜձࣾͰ Cocos2d;xΛͬͨεϚϗήʔϜ։ൃ
• ࠷ۙgo:generate͕ϚΠϒʔϜ ※1"ΞΠίϯ݄ඣͷᘡᘚ͞ΜͰ͢ɻ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 2
࣍ • ֓ཁ • ։ൃϑϩʔ • ࠓޙʹ͍ͭͯ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 3
֓ཁ Goͷ։ൃϑϩʔͰɺͲΜͳπʔϧٕज़Λ͍ͬͯΔͷ͔ɺ Ұൠతͳ։ൃϑϩʔʹͦͬͯॱ൪ʹհ͠·͢ɻ ରऀ: • ͜Ε͔ΒGoΛಋೖ͠Α͏ͱ͍ͯ͠Δ • ͢Ͱʹಋೖ͍ͯͯ͠ଞͰͲͷΑ͏ʹ։ൃ͍ͯ͠Δ͔Γ͍ͨ • ৽نΞαΠϯͨ͠ϝϯόʔ
@k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 4
։ൃϑϩʔʢ֓ཁʣ • ڥߏஙɾΤσΟλ • ίʔσΟϯάɾ࣮ɾςετ • εςʔδϯάڥɾσϓϩΠઓུ • ͦͷଞʢϥΠϒϥϦબఆɺύοέʔδ/ϑΝΠϧ͚ʣ •
ӡ༻ɾࢹ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 5
ڥߏஙɾΤσΟλ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 6
ڥߏங • GoڥࣄલʹbrewͰߏஙࡁΈͱ͍͏લఏ • ϓϩδΣΫτͷREADME.mdʹڥߏஙखॱΛهࡌ͍ͯ͠Δ • PCMac͕ଟ͍͕ɺUbuntuͰ։ൃ͍ͯͨ͠ϝϯόʔ͍ͨ • ڥͷҧ͍Ͱͷτϥϒϧ͕ى͖ͨέʔεࠓͷͱ͜Ζͳ͍ •
ࠓͷͱ͜ΖWindowsͰ։ൃ͍ͯ͠Δਓ͍ͳ͍ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 7
ΤσΟλ • IntelliJ)IDEA)Community)Edi3on • Sublime • Vim • Emacs gofmt
-sͱ͔goimportsΛߦ͍ͬͯΔͷͰɺجຊతʹΤσΟλ ͷҧ͍Ͱࠔͬͨέʔεͳ͍ɻ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 8
IntelliJ(IDEAͰGo • ࣗIntelliJ)IDEAਪ͠ • Community)Edi3onʢແྉʣ • ࠷ۙɺGolang)Pulginͷ։ൃ͕IntelliJຊ ՈͷਓʁʹมΘͬͨΒ͍͠ • ver0.9ͷࠒͱ͘Βͯɺ։ൃ׆ൃʹ
ͳΓɺ͔ͳΓ͍উखྑ͘ͳͬͨ • packageิɾίʔυิɾࢀরݩݕࡧ ͳͲͳͲ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 9
ίʔσΟϯάɾ࣮ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 10
ϩʔΧϧͰͷಈ࡞֬ೝ • go test͢Δ • ͘͠build࣮ͯ͠ߦ͢Δ • gdbͷσόοΨجຊతʹ͍ͬͯͳ͍ • printσόοάͰे
• MySQL,Redis,MongoDBɺϩʔΧϧͷͷΛར༻ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 11
ίʔσΟϯάΨΠυ ࠓɺίʔσΟϯάΨΠυͳ͍ɻҎԼ͘Β͍Ͱेͳೝࣝɻ • A tour of goΛͻͱ௨Γ͓ͬͯ͘ • Effec&veGoΛҰಡ͢Δ •
ӏࣂจහ͞ΜͷʮGoʹೖͬͯGoʹै͑ʯΛҰಡ͢Δ※2 • golintͰͷfiled໊ରԠ͢ΔʢId34>3ID,3hogeUrl34>3hogeURLʣ ※2"h$p:/ /ukai,go,talks.appspot.com/2014/gocon.slide#1 @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 12
ςετ • guregu/mogiΛͬͯsqlmockͯ͠Δ • RedisMongoDBɺϩʔΧϧͷtest༻ʹଓઌΛม͍͑ͯΔ • Handlerͷtestʹɺී௨ʹnet/h8ptestΛͬͯΔ • tes:ngϑϨʔϜϫʔΫͬͯͳ͍ʢGunosy.go#10Λࢀর※3ʣ ※3"Gunosy.go#10"testnight"h2p:/
/gunosygo.connpass.com/event/8485/ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 13
εςʔδϯάڥɾσϓϩΠઓུ ͔͍͍ͬ͜deployϑϩʔ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 14
@k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 15
ͦͷଞ ʢϥΠϒϥϦબఆɺύοέʔδ/ϑΝΠϧ͚ʣ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 16
ϥΠϒϥϦબఆ • Ͱ͖Δ͚ͩgopkg.inͰόʔδϣϯݻఆ͍ͯ͠ΔͷΛར༻ • GodepͷύοέʔδϥΠϒϥϦར༻͍ͯ͠ͳ͍ • ಋೖ͢Δࡍʹ୲ऀ͕ͪΌΜͱௐࠪɾݕ౼ͯ͠ଞͷϝϯόʔͱ ૬ஊ͔ͯ͠ΒೖΕΔ • ࣗ͘͠࡞͢Δ
• ֎ʹग़ͤΔͷɺͲΜͲΜϥΠϒϥϦԽͯ͠GitHubͰެ։ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 17
GitHubެ։͍ͯ͠ΔϥΠϒϥϦ ओͳϥΠϒϥϦΛൈਮʢଞʹ৭ʑ͋Γ·͢ʣ - gopkg.in/guregu/null.v2: nullՄೳSQLΛѻ͏ - github.com/guregu/toki: SQLTIMEܕͷnullՄೳ - github.com/guregu/buildver:
build versionʢ4.1.10.5ʣͱ͔Λѻ͏ - github.com/guregu/mogi: sqlͷελϒ - github.com/guregu/kami: gojiϕʔεͷWebϑϨʔϜϫʔΫ - github.com/kyokomi/goebi: errbitΫϥΠΞϯτ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 18
ύοέʔδ͚ɺιʔεϑΝΠϧ͚ • ࣾڞ௨ύοέʔδΛผϦϙδτϦʹཱ͍ͯͯΔ:# github.com/gunosy/go • σΟϨΫτϦߏͱ͍͏͔ύοέʔδ͚ະͩʹ՝ • ͜Εͷ࣌͜͏͍͏ߏ͕͍͍ͱ͍ܾͬͨఆ൛͕·ͩͳ͍ • ύοέʔδ͚ɺϑΝΠϧ͚ͷݟΛڞ༗͢ΔษڧձΓ
͍ͨͱࢥͬͯΔ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 19
ӡ༻ɾࢹ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 20
ӡ༻ɾࢹ • panicͷHandlerͰpanicͨ͠Βɺmail௨͍ͯ͠ΔʢerrbitҠߦ͠ ͨͷͰΊΔ༧ఆʣ • ඪ४ग़ྗΛlogϑΝΠϧʹग़ྗ • ࠷ۙɺerrbitΛಋೖͯ͠Τϥʔࢹ͢ΔΑ͏ʹͨ͠ • pprofͷ༰
@k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 21
@k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 22
@k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 23
ࠓޙʹ͍ͭͯ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 24
ίʔσΟϯάΨΠυ࡞ ࣾίʔσΟϯάΨΠυͷ࡞Λߟ͍͑ͯΔɻ • ྑ͘ͳ͍ྫ • ϨϏϡʔͰࢦఠ͕͋ͬͨͷ ΨΠυͱ͍͏΄ͲͷͷͰͳ্͍͕هͷΑ͏ͳͷΛݟ͘͢ ͯ͠·ͱΊ͓͚ͯͩ͘ͰΑͦ͞͏ɻ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 25
υΩϡϝϯτཧ Qiita:Teamͱ͔wikiͱ͔ʹॻ͘ͱɺ͍͍ͪͪ։͔ͳ͍ͱ͍͚ͳͯ͘ ߋ৽͕ਏ͍ɻ APIυΩϡϝϯτͷࣗಈੜʢGoDocϕʔεʣ ݱࡏਐߦதʢࠓkamiઐ༻͕ͩɺ70%͘Β͍Ͱ͖ͯΔʣ (github.com/kyokomi/renkin(※4 ※4"h$ps:/ /github.com/kyokomi/renkin @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 26
package main import ( "fmt" "net/http" "strconv" "github.com/guregu/kami" "golang.org/x/net/context" )
func main() { kami.Get("/foo/:id", fooHandler) kami.Get("/bar/:name", barHandler) } // fooHandler IDΛࢦఆͯ͠FooͳΜ͔औಘ͢ΔAPI func fooHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { idStr := kami.Param(ctx, "id") // UserΛҰҙʹࣝผ͢ΔID numStr := r.FormValue("num") // ΞϨͷ݅ʢ1ʙ10ʣ key := r.FormValue("key") // ͦΕΛऔಘ͢ΔKey userID, err := strconv.Atoi(idStr) num, _ := strconv.Atoi(numStr) fmt.Println(userID, err, num, key) } // barHandler NameΛࢦఆͯ͠BarͳΜ͔औಘ͢ΔAPI func barHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) { // hogehoge } @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 27
// NOTE: THIS FILE WAS PRODUCED BY THE // RENKIN
APIDOC GENERATION TOOL (github.com/kyokomi/renkin) // DO NOT EDIT /* RENKIN APIDOC GENERATION TOOL (https://github.com/kyokomi/renkin). Get fooHandler ɾɾɾ IDΛࢦఆͯ͠FooͳΜ͔औಘ͢ΔAPI Path: "/foo/:id" Params: 1. `"id"`: UserΛҰҙʹࣝผ͢ΔID (kami.Param) 2. `"num"`: ΞϨͷ݅ʢ1ʙ10ʣ (r.FormValue) 3. `"key"`: ͦΕΛऔಘ͢ΔKey (r.FormValue) file at example/main.go. Get barHandler ɾɾɾ NameΛࢦఆͯ͠BarͳΜ͔औಘ͢ΔAPI Path: "/bar/:name" Params: none file at example/main.go. */ package main @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 28
@k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 29
ςετ kyokomi/renkinͷϑΣʔζ̎Λݕ౼தɻ • ֤APIͷςετίʔυͻͳܗΛgo:generateࣗಈੜ • ίϐϖͯ͠গ͢͠खؒΛݮΒ͍ͨ͠ • εςʔδϯάڥ͚ͷ૯߹ςετͷίʔυࣗಈੜ • શAPIΛୟ͘Πϝʔδ
@k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 30
͓ΘΓ @k_yokomi,)2015)ʮGunosy)APIνʔϜ)Go։ൃϑϩʔʯ 31