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
Goで作るWebアプリケーション Echo 編 といいつつGoの説明多い
Search
Takashi Funato
August 07, 2019
Programming
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goで作るWebアプリケーション Echo 編 といいつつGoの説明多い
Takashi Funato
August 07, 2019
More Decks by Takashi Funato
See All by Takashi Funato
AWS をちょっとわかった気になる / Kinda feel the AWS
tfunato
0
100
人に優しいAWS運用
tfunato
0
90
OSI reference model Layer I
tfunato
0
62
Scalaで実装した 分散処理システムの超概要
tfunato
0
210
Docker勉強会
tfunato
1
160
GISとして活用するElasticsearch
tfunato
6
8k
Other Decks in Programming
See All in Programming
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
110
今さら聞けない .NET CLI
htkym
0
200
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
210
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
220
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.9k
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
130
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.8k
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.1k
リアルな遅延を測る仕様
kota_yata
1
120
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
430
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
300
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.4k
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
770
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
410
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
400
4 Signs Your Business is Dying
shpigford
187
23k
Writing Fast Ruby
sferik
630
63k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
440
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Transcript
GoͰ࡞ΔWebΞϓϦέʔγϣϯ Echo ฤ ͱ͍͍ͭͭGoͷઆ໌ଟ͍ Sangenjaya Yumemi, Aug 07 2019 Takashi
Funato YUMEMI Inc. @tfunato by Renée French
{ Simplicity. ࣗݾհ • ᢠށɹོ(tfunato) • αʔόαΠυҰے • PHPɺNode.jsɺJavaɺetc •
AWS ೝఆσϕϩούʔ ΞιγΤΠτ • ༗ޮظݶΕͨ • ͳΜͰͬͯΔ • ୭͔কعΛࢦͦ͏ • ࡉ͔͍༰ϓϩϑΟʔϧΈͯͪΐ 2
Agenda ɾGoͷઆ໌ ɾGoͱWeb ɾWebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ ɾEchoͷհ ɾ·ͱΊ
Goͷઆ໌
Goͷઆ໌ - ಛ - • ੩తܕ͚ • ༷ʑͳܕ • ߏମͱϙΠϯλ
• ΦϒδΣΫτࢦͰͳ͍ • ݴޠ͕࣋ͬͯΔϥΠϒϥϦ • ίϯύΠϧ • ಈ࡞ڥ • ϝϞϦཧ 5
Goͷઆ໌ - ੩తܕ͚ - • ؔͷҾɺฦΓ͕༧Ίܕ͕ܾ·͍ͬͯΔ • ίϯύΠϧ࣌ʹݫີʹܕνΣοΫ͞ΕΔ • Duck
Typing࣮ߦ࣌νΣοΫ • ͱ͍͑ • interface{}ܕͱ͍͏ͷ͋Δ 6
Goͷઆ໌ - ༷ʑͳܕ - جຊܕ ओͳͷ 7 ໊લ આ໌ ॳظ
ܕ JOU ࣮ܕʹґଘͨ͠ܕ JOU ූ߸͖ɺఴࣈCJU JOU JOU JOU จࣈྻ TUSJOH จࣈྻΛ֨ೲ ۭจࣈ ਅِ CPPM USVF GBMTF '"-4&
Goͷઆ໌ - ༷ʑͳܕ - ෳ߹ܕ ओͳͷ 8 ྫ આ໌ ྻܕ
<>JOU ݸͷཁૉΛ࣋ͬͨJOU εϥΠεܕ <>JOU Մมྻ ϙΠϯλܕ JOU ϝϞϦ্ͷΞυϨεΛද͢ܕ Ϛοϓܕ NBQ<TUSJOH>JOU TUSJOHΛLFZɺJOUΛWBMVFʹͭ ؔܕ GVOD JOU JOU ؔΛ֨ೲ͢Δܕ ߏମܕ UZQFTUSVDU ߏମΛ֨ೲ͢Δܕ ΠϯλʔϑΣʔεܕ JOUFSGBDF\^ جຊతʹԿͰ֨ೲͰ͖Δܕ
Goͷઆ໌ - ߏମͱϙΠϯλ - • ߏମ • ৽͘͠ܕΛ࡞Δ • ෳ߹σʔλू߹
• ϑΟʔϧυͱ͍͏ • ϙΠϯλ • ϝϞϦͷΞυϨε • ؔͷҾͰ໌ࣔ͠ͳ͍ͱɺجຊతʹ͠ 9
Goͷઆ໌ - ߏମ - 10 // ߏମܕͷએݴ type hoge struct
{ id int name string } // ߏܕͷॳظԽ ϑΟʔϧυࢦఆ var h hoge h.id = 1 h.name = “test” // ߏܕͷॳظԽ ߏମϦςϥϧ h := hoge{ id : 1, name : “test”, }
Goͷઆ໌ - ϙΠϯλ - 11 CݴޠͷϙΠϯλͱಉ͡Α͏ʹϝϞϦͷΞυϨεΛѻ͏ var a int =
100 var aPointer *int = &a // &ΞυϨεԋࢉࢠɻΞυϨεΛऔಘ͢Δ͜ͱ͕Ͱ͖Δ // * ϙΠϯλܕɻΞυϨεΛ֨ೲͰ͖Δ ͠ɺϙΠϯλ͠Λҙࣝ͢Δ ੑೳɺίʔυྔʹؔΘͬͯ͘Δ
Goͷઆ໌ - ΦϒδΣΫτࢦͰͳ͍ - 12 • ΦϒδΣΫτࢦͰͳ͍͕ɺߏମʹࣅͨΑ͏ͳৼΔ͍ Λͤ͞Δ͜ͱ͕Ͱ͖Δ type Name
struct { FirstName string LastName string } type Printer interface { print() string } func (n *Name) print() string { return n.FirstName + LastName } name := Name{FirstName: “Hoge”, LastName: “Fuga”} printName := name.print()
Goͷઆ໌ - ݴޠ͕࣋ͬͯΔϥΠϒϥϦ - • GoࣗମͷϥΠϒϥϦ͕๛ʂ • https://golang.org/pkg/ • https://godoc.org/-/subrepo
• αϒύοέʔδ 13
Goͷઆ໌ - ίϯύΠϧ - • ίϯύΠϥݴޠͰ͢ • OS ωΠςΟϒόΠφϦͰಈ͖·͢ •
ґଘ͢ΔϥΠϒϥϦͳ͠ • ֤OSຖʹίϯύΠϧ • ಈ࡞ڥɿPOSIXʢLinuxɺMacOS)ɺWindows • CݴޠͷLinkerͱ͔͍Βͳ͍ • go build • ϏϧυͰMakefileΛΑ͘͏ 14
Goͷઆ໌ - ϝϞϦཧ - • ϝϞϦཧGCʹجຊ͓·͔ͤ • ͱ͍͑ɺ࡞Γ͕ѱ͚ΓΌϦʔΫ͢Δ • Α͠ͳʹͬͯ͘ΕΔ
• ௨ৗɺϝϞϦͷΞϩέʔγϣϯίετ͕ߴ͍ • ͦΕͰGo݁ߏૣ͘ಈ͘ 15
GoͱWeb
GoͱWeb • ͱͱݴޠࣗମͷϥΠϒϥϦ͕खް͍ // HTTPαʔό (main.go) package main import
( "io" "log" "net/http" ) func main() { helloHandler := func(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "Hello, world!\n") } http.HandleFunc("/", helloHandler) log.Println("Listening...") http.ListenAndServe(":3000", nil) // open 3000 port }
GoͱWeb • ݴޠࣗମʹWebαʔόͷػೳ͕͋ΔͷͰɺ֤छϑϨʔ ϜϫʔΫɺMVCͷجຊػೳʹूதͰ͖Δ
WebΞϓϦέʔγϣϯ ϑϨʔϜϫʔΫ
• ΊͬͪΌͨ͘͞Μ͋Δ • gin • beego • iris • echo
• ͦͷଞɺRESTʹಛԽͨ͠ͷRoutingʹಛԽͨ͠ͷ WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫ • ϑϨʔϜϫʔΫͰ࣮͞ΕΔͷେ͖͚ͯ͘ɺجຊత ʹԼهͷ̏ͭ • Routing • Request Mapping •
Response Mapping • MiddleWareʢLaravelͰ͍͏MiddleWareʣ • ͦͷଞ • LoggingͳͲ
Echoͷհ
ɾEchoΛબΜͩΘ͚ ɾEchoͷհʢRESTΆ͍ͭʣ ɾσϞ
EchoΛબΜͩΘ͚ • Node.JSͷExpressʹࣅ͍ͯΔ • ͲΕࣅͨΑ͏ͳײ͕͢͡Δ • GithubͷStarΈΜͳɺ1ສ͑ͯΔ • υΩϡϝϯτͷྔɺ࣭Ͳ͏͔ʁ •
GoogleͰώοτ͢͠͞ • αΠτͷใྔ • ։ൃऀͷ׆ൃ͞ • CommitɺϦϦʔεɺPRͷফԽͳͲ 24
Echoͷઆ໌ • Echo ͍ʂͱ͋Δ • Ginͱൺ͍ͯΒ͍͠ • ͞ਖ਼ٛ • Data
binding͕JSONɼXMLɼFormͳͲͪΌΜͱ͋Δ • RoutingΛGroupingͰ͖Δ • HTTPͷΤϥʔϋϯυϦϯά͍͢͠ • https://echo.labstack.com/ • 25
Echoͷհ - Routing - • جຊతͳRouting • /hello • /users/:id
• /users/* • Grouping • adminGroup := e.Group(“/admin”) • adminGroupʹઃఆͨ͠ͷɺͦͷύεҎ߱Ͱ༗ޮʹͳΔ • “/admin/*” ͷύεͰBasic ೝূ͍ͨ͠ͱ͔ • Method • GETɺPOSTɺPUTɺDELETE… 26
Echoͷհ - MiddleWare - • EchoࣗͰଟ͘༻ҙ͞Ε͍ͯΔ • ͪΖΜࣗ࡞Մೳ • BasicೝূɺgzipɺJWTɺCORSͳͲͳͲ
• GroupϨϕϧͰɺRoutingϨϕϧͰ • Group • admin := e.Group("/admin", middleware.BasicAuth()) • Route • e.GET("/", <Handler>, <Middleware…>) 27
Echoͷհ - RequestͱResponse - • RequestߏମͰఆٛͨ͠ͷʹBind͢Δ • ߏମͷλάͰ੍ޚ͢Δ 28 //
RequestΛड͚औΔߏମܕͷએݴ type UserRequest struct { ID int `json:”id"` Name string `json:”name”` } ߏମͷλά KTPOCPEZ \ lJEz lOBNFzlUFTUz ^ Λड͚Δઃఆ
Echoͷհ - RequestͱResponse - • JSONΛฦ͢ͷͰ͋ΕɺResponseߏମͰఆٛ • ߏମͷλάͰ੍ޚ͢Δ 29 //
ResponseΛఆٛͨ͠ߏମܕͷએݴ type UserResponse struct { ID int `json:”id"` Name string `json:”name”` } ߏମͷλά KTPOCPEZ \ lJEz lOBNFzlUFTUz ^ Λड͚Δઃఆ
σϞ • Basicೝূ͔͚ͨɺ͠ࢉ͢Δ͚ͩͷAPI • go mod init go-sample • ϓϩδΣΫτॳظԽ
• main.go ࡞ • go runʂ 30
·ͱΊ
·ͱΊ • go ࣗମͱ͖͍ͬͭ͢ • ͨͩɺϋϚΓ͍͢ϙΠϯτ͕ࢁ͋Δ • ߏମͱϙΠϯλͪΐͬͱ͍͠ • खܰʹπʔϧΛ࡞ΕΔ
• ڥߏஙͱ͔΄΅ཁΒͳ͍ • 1όΠφϦͰಈ͘ͷͰɺָͪΜ
#golang νϟϯωϧ͋ΔΑ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠