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
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.5k
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
3
580
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
3
1.1k
2026_devsumi_ozono.pdf
o3
3
550
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
210
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
700
俺の仕事は AIに奪われないし、たぶんその BIも要らない
hikaruri
0
540
10Xに技術的負債をもたらした「2つの境界の歪み」その構造と解消への営み
10xinc
0
2.3k
[Kiro Meetup #7] Kiro Crew Dive Deep
konippi
0
120
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
300
beyond jj: config & tools ecosystem
indirect
0
5.8k
データ_AIの事業の勝敗をわけるもの
nek0128
1
470
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
We Are The Robots
honzajavorek
0
380
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
910
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
710
Why Our Code Smells
bkeepers
PRO
340
58k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
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