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
Make a REST Server on Golang
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
cupper
August 07, 2019
Programming
95
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
110
History of HTTP
cupperservice
0
86
Let's get started with Scala
cupperservice
0
400
All in Scala
cupperservice
0
56
Recommendation_of_Gatling.pdf
cupperservice
2
560
Golang on AWS
cupperservice
0
49
What's scala.js?
cupperservice
0
59
How to work in local
cupperservice
0
63
Why do you use JavaScript
cupperservice
0
35
Other Decks in Programming
See All in Programming
Oxcを導入して開発体験が向上した話
yug1224
4
330
The NotImplementedError Problem in Ruby
koic
1
900
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
280
Contextとはなにか
chiroruxx
1
360
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.5k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
140
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
190
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
180
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
8
4.2k
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
AIで効率化できた業務・日常
ochtum
0
140
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.6k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
Prompt Engineering for Job Search
mfonobong
0
350
Facilitating Awesome Meetings
lara
57
7k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
430
sira's awesome portfolio website redesign presentation
elsirapls
0
280
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
400
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
850
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
170
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The Pragmatic Product Professional
lauravandoore
37
7.3k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
430
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