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
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
120
History of HTTP
cupperservice
0
100
Let's get started with Scala
cupperservice
0
420
All in Scala
cupperservice
0
56
Recommendation_of_Gatling.pdf
cupperservice
2
570
Golang on AWS
cupperservice
0
49
What's scala.js?
cupperservice
0
63
How to work in local
cupperservice
0
63
Why do you use JavaScript
cupperservice
0
40
Other Decks in Programming
See All in Programming
Webの地図
yosuke_furukawa
PRO
6
4.6k
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
320
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
180
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
320
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
280
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
480
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
300
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
220
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3k
SREの越境 / SRE Collaboration
y0hgi
2
220
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
550
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
420
Featured
See All Featured
Bash Introduction
62gerente
615
220k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
340
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
420
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Exploring anti-patterns in Rails
aemeredith
4
510
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
470
Accessibility Awareness
sabderemane
1
210
Paper Plane
katiecoart
PRO
4
53k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Darren the Foodie - Storyboard
khoart
PRO
4
3.9k
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