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
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
110
人に優しいAWS運用
tfunato
0
91
OSI reference model Layer I
tfunato
0
66
Scalaで実装した 分散処理システムの超概要
tfunato
0
210
Docker勉強会
tfunato
1
160
GISとして活用するElasticsearch
tfunato
6
8k
Other Decks in Programming
See All in Programming
カツオ、ご期待ください
suneo3476
0
100
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
230
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.4k
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
270
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
220
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.5k
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
300
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
130
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
260
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
320
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
350
Verilogで学ぶCPU自作入門.pdf
uyuki234
8
3.3k
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
610
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
600
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Building AI with AI
inesmontani
PRO
1
1.2k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
260
The World Runs on Bad Software
bkeepers
PRO
72
12k
Evolving SEO for Evolving Search Engines
ryanjones
0
300
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
How to Talk to Developers About Accessibility
jct
2
550
Navigating Weather and Climate Data
rabernat
0
530
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 νϟϯωϧ͋ΔΑ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠