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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
570
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
320
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
300
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
230
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
210
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
480
プロポーザルを書いてもらう
pvcresin
0
560
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
120
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
700
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
650
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
150
Featured
See All Featured
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The Invisible Side of Design
smashingmag
301
52k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
270
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
800
Bash Introduction
62gerente
615
220k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
Navigating Weather and Climate Data
rabernat
0
480
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
210
Automating Front-end Workflow
addyosmani
1369
210k
The SEO Collaboration Effect
kristinabergwall1
1
520
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 νϟϯωϧ͋ΔΑ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠