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
Goで作るWebアプリケーション Echo 編 といいつつGoの説明多い
Search
Takashi Funato
August 07, 2019
Programming
120
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
110
人に優しいAWS運用
tfunato
0
93
OSI reference model Layer I
tfunato
0
68
Scalaで実装した 分散処理システムの超概要
tfunato
0
210
Docker勉強会
tfunato
1
170
GISとして活用するElasticsearch
tfunato
6
8k
Other Decks in Programming
See All in Programming
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
200
AI時代のFlutter品質設計 — アプリ品質を守るQuality Layers
omatty198
0
350
Enforcing Your Architecture with Unit Tests in the AI Era (Swift Connection X)
steliosf
PRO
1
120
AmebaブログはKMPから卒業します
kmars0605
0
310
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
260
私なりのハーネスエンジニアリング ~独自の言語処理系の開発を通して~
seosoft
0
170
Groovy as a human and AI friendly programming language
paulk
0
170
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
340
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
300
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
340
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
610
Producing Creativity
orderedlist
PRO
348
41k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Practical Orchestrator
shlominoach
192
12k
Site-Speed That Sticks
csswizardry
13
1.6k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
420
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
121
120k
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 νϟϯωϧ͋ΔΑ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠