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
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
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
390
AI 輔助遺留系統現代化的經驗分享
jame2408
1
960
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
180
dRuby over BLE
makicamel
2
390
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
170
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
570
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
730
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
290
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.5k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
600
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
7k
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Embracing the Ebb and Flow
colly
88
5.1k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Between Models and Reality
mayunak
4
350
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
320
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
200
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
My Coaching Mixtape
mlcsv
0
150
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Skip the Path - Find Your Career Trail
mkilby
1
150
How GitHub (no longer) Works
holman
316
150k
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