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
Make a REST Server on Golang
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
cupper
August 07, 2019
Programming
97
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Make a REST Server on Golang
cupper
August 07, 2019
More Decks by cupper
See All by cupper
kintoneでAWSリソースを管理する
cupperservice
0
120
History of HTTP
cupperservice
0
100
Let's get started with Scala
cupperservice
0
420
All in Scala
cupperservice
0
61
Recommendation_of_Gatling.pdf
cupperservice
2
580
Golang on AWS
cupperservice
0
49
What's scala.js?
cupperservice
0
63
How to work in local
cupperservice
0
65
Why do you use JavaScript
cupperservice
0
41
Other Decks in Programming
See All in Programming
Domain-Driven Transformation
hschwentner
2
2.3k
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
610
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
500
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
250
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
240
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
650
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
180
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
sira's awesome portfolio website redesign presentation
elsirapls
0
460
Odyssey Design
rkendrick25
PRO
2
870
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
For a Future-Friendly Web
brad_frost
184
10k
Transcript
GoでREST Serverを 作ってみました! 2019.08.07 Kazuhisa Kawashima Renée French
自己紹介:川嶋一寿 • 2019年6月ゆめみに入社(ゆめみは3社目) • フルリモート勤務(静岡) • Golangの経験 なし(仕事がありそうだからやってみる) • 好きな言語
Scala, TypeScript 参考:Shizuoka.jsでのLT資料
Agenda • 方針 • 開発環境 • システム構成 • 処理概要 •
感想 • Shizuoka.go
方針
方針 以下の方針でシステムを作成する • 基本パッケージのみを使用する(原則) • 実施に動作するシステムを作る • エラー処理も正しく書く • DIする
開発環境
使用言語 以下の2つを使用 • Go Language サーバ側で使用 • Vue / TypeScript
クライアント側で使用
エディタ Visual Studio Codeを使用 いろいろなプラグインがあって便利 • Microsoft Remote Containers •
Microsoft Go language support • Vetur • Microsoft Remote SSH • Microsoft Live Share
動作環境 Mac版 Docker Desktopを使用 以下の3つのContainerを使用 • Web Server • Application
Server • DB Server
システム構成
Docker システム構成 Webブラウザ Webサーバ Nginx アプリサーバ Golang DBサーバ PostgreSQL
Demo
処理概要
構成(モジュール) Main Controller Service <<interface>> Repository Repository PostgreSQL Message
構成(DB) Word word_id id content create_date update_date id content create_date
update_date reference_date Example
Main 各モジュールを用意し、クライアントからの受付を開始 する。 repo, err := repository.NewRepository(&config) service := service.DicService
{ Repo: repo } // コンストラクタインジェクション wc := controller.WordController { Service: service } router := mux.NewRouter() sub := router.PathPrefix("/word/").Subrouter() sub.HandleFunc("/histories", wc.GetHistories).Methods("GET") ・・・ http.Handle("/", router) http.ListenAndServe(":80", nil)
Router 各パスにControllerの関数を割り当てる router := mux.NewRouter() sub := router.PathPrefix("/word/").Subrouter() sub.HandleFunc("/histories", wc.GetHistories).Methods("GET")
sub.HandleFunc("/", wc.AddWord).Methods("POST") sub.HandleFunc("/{id:[0-9]+}/example", wc.GetExamples).Methods("GET") sub.HandleFunc("/{id:[0-9]+}/example", wc.AddExample).Methods("POST") ※ gorillaを使用。net/httpでもルーティングの設定はできるが、メソッド やパスのパターンによる割り振りができない。
Gorillaとは • Webの処理で利用できるツールキット • RouterやSessionなど、Webに必要なモジュール がある • 利用するパッケージだけimportして使う 今回はRouterのみを利用
Controller 以下を行う • リクエストのパース • Serviceへの処理要求 • Serviceの処理結果の処理 実際のコードを見る >>>
Message type Word struct { Id int `json:"id"` Content string
`json:"content"` CreateDate time.Time `json:"create_date"` UpdateDate time.Time `json:"update_date"` ReferenceDate time.Time `json:"reference_date"` } type Example struct { Id int `json:"id"` WordId int `json:"word_id"` Content string `json:"content"` CreateDate time.Time `json:"create_date"` UpdateDate time.Time `json:"update_date"` }
Service ビジネスロジック func (o *DicService) AddWordIfNotExist(word *Word) error { w,
err := o.Repo.GetWord(word) if err != nil { return err } if w == nil { return o.Repo.AddWord(word) } else { return err } }
Repository 永続化を行うインターフェース type WordRepository interface { AddWord(word *Word) error GetWord(word
*Word) (*Word, error) GetWords(order string, limit int) ([]Word, error) AddExample(example *Example) error GetExamples(word *Word) ([]Example, error) Close() }
Repository for postgresql PostgreSQLを使用するRepository 実際のコードを見る >>>
感想
苦労した点 • パッケージ名ってどうするの? • ポッ ポインター ! • エラー処理はどうすればよい?
パッケージ名 importの使い方が、Javaと違う • package名とモジュールの保管先ディレクトリ名は 違って良い ※Javaは一致する必要あり • importには、package名ではなくモジュールを保管 したパス(GOPATHからの相対パス)を指定 ※Javaは、package名を指定
※ここ見れば理解できる
ポインター • C言語と同様。 ただし、C言語のようにアドレスをずらすことはでき ない。 • 明示しなければ値渡しになる • ポインターを使用しないケース immutableにする場合(例:time.Time)
https://yumemi.slack.com/archives/CHL24D4JY/p1562881539039800
エラー処理 • 関数の復帰値でerrorを返す • 下位のモジュールのエラーをラップする場合は、 golang/x/xerrorsを使う ↑の方法で呼び出し元はエラーの種別をどうやって判 断する?
xerrors func readFile(filename string) error { fp, err := os.Open(filename)
if err != nil { return xerrors.Errorf("Can not open file.: %w", err) } defer fp.Close() reader := bufio.NewReaderSize(fp, 4096) for line := ""; err == nil; line, err = reader.ReadString('\n') { fmt.Print(line) } if err != io.EOF { return xerrors.Errorf("Can not read file: %w", err) } else { return nil } }
golangの良いところ • とっかかりやすい 言語仕様で理解すべきことが少ない • Googleが開発している GCPと相性良い? • 起動が早い (対JVM言語)
• Gopher君は好き クレジット表記のみで利用可能 Creative Commons Attributions 3.0 Renée French
Shizuoka.go
Shizuoka.goとは 静岡市で実施するgolangの勉強会 7/20に第14回目が実施済み 14回目の題目は以下 ・errors + log ・非同期処理 ・ライブラリやフレームワーク 参加人数は少なめ
Shizuoka.goの今後の活動 次回の開催は未定 だが、 Go 1.13のリリースを記念して、 8/22にGo 1.13 Release Party in
shizuokaを開催 https://shizuoka-go.connpass.com/event/140162/
Thank you for listening! Renée French