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
ボーイスカウトルールでメモリやスキルを改善しよう
azukiazusa1
4
1.5k
AI Native なプロダクト組織の立ち上げ方 : 生産性 100 倍への挑戦
mikesorae
0
170
ソニー銀行におけるビジネスアジリティ向上のためのクラウドシフト戦略
srenext
0
860
Alphaモジュール使っていいのかい!?いけないのかい!?どっちなんだいっ!?
watany
1
290
AI時代の開発生産性を捉え直す — 経営と現場をつなぐ「開発組織のオブザーバビリティ」— / AI Dev Ex Conference 2026
tkyowa
0
150
マルチアカウント環境でSecurity Hubの運用、その後どうなった? / SRE NEXT 2026 miniLT会
genda
0
110
公式ドキュメントの歩き方etc
coco_se
1
120
「顧客の声を聞かなければ何も始まらない」 ── 顧客の声から生まれた『AI返信補助機能』の開発プロセス / AICon2026_shikata_imai
rakus_dev
0
120
ファミコンでPHPを動かす / PHP on the Famicom
tomzoh
2
480
プロダクト開発組織の現在地(Ver.2026/07) / product-organization
kaonavi
0
120
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
250
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
280
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Color Theory Basics | Prateek | Gurzu
gurzu
0
390
How to train your dragon (web standard)
notwaldorf
97
6.7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Accessibility Awareness
sabderemane
1
160
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
350
How to make the Groovebox
asonas
2
2.3k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
450
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