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
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
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3.7k
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
150
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.2k
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
270
JIS keyboard support in Omarchy
lef237
0
110
AWSに止められる覚悟してますか?
morizo_1984
2
530
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
430
気持ちぃ〜角丸 Squircle
ryu1013
0
310
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
160
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
630
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
520
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
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