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
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
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
アクセスキーが漏れた日にやるべきこと- 無効化の先にある本当の対応
kazzpapa3
0
370
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
470
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
380
APIセキュリティを組織で実現するには~注力する点と設計・実装に入れたい対策~
riiimparm
2
780
マイナンバーカード本人確認の実装比較(OAuth/OIDC Numa (Immersion) Workshop 2026) / 20260825 numa-12
oidfj
PRO
0
360
ブラウザで変わるID連携(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
380
hookで自作する Claude Code の「実況ボード」
shinyasaita
2
240
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.3k
医療の現場を変革に挑戦した半年間の軌跡 - PythonとAIで現場を変える / From Code to Care
soudai
PRO
1
640
Digital Credentials API × OpenID4VP ブラウザ完結型本人確認の実装知見(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
360
Featured
See All Featured
Speed Design
sergeychernyshev
33
2k
Six Lessons from altMBA
skipperchong
29
4.5k
Crafting Experiences
bethany
1
270
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
180
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
230
Testing 201, or: Great Expectations
jmmastey
46
8.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Pragmatic Product Professional
lauravandoore
37
7.4k
How GitHub (no longer) Works
holman
316
150k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
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