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
Gunosy APIチームGo開発フロー
Search
kyokomi
March 11, 2015
Technology
6.4k
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.7k
さくっと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
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
520
メルペイ 会計システム概要と歴史
mewuto
0
150
組み立てて楽しむ AWS Blocks 入門
kmiya84377
0
220
AI時代のAPI開発を加速する品質ガードレール / API Quality Guardrails in the AI Era
yokawasa
0
150
AIアプリを使い分けるための共通ツール基盤を考えてみる#devio2026
osawa
0
260
私の推しは「聞いてから進む」AIです -AI-DLCに一人でアプリを作らせた話
yama3133
1
180
使いこなすために知っておきたい Azure SRE Agent アンチパターン
torumakabe
2
360
[2026 Oracle Technical Deep Dive] VMwareワークロードのOCI移行実践ガイド - OCVSでの継続利用からOCIコンピュートへの移行まで (2026年9月17日開催)
oracle4engineer
PRO
0
120
形式手法を使って仕様をコーディングしよう
mikanichinose
0
180
Google Cloud Next Tokyo 26登壇時のスクリプト
recruitengineers
PRO
0
200
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
310
[2026 Oracle Technical Deep Dive] エンタープライズAIエージェントを支えるOCIソリューション。ラインナップと特徴を理解しよう! (2026年9月17日開催)
oracle4engineer
PRO
0
540
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
GitHub's CSS Performance
jonrohan
1033
470k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
910
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.2k
A better future with KSS
kneath
240
18k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
How GitHub (no longer) Works
holman
316
150k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
550
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
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