SlideShare a Scribd company logo
Golangで
REST Serverを
作ってみました!
2019.09.12
Kazuhisa KawashimaRenée French
自己紹介:川嶋一寿
● 2019年6月株式会社ゆめみに入社(3社目)
● フルリモート勤務(静岡)
● Golangの経験
なし(仕事がありそうだからやってみる)
● 好きな言語
Scala, TypeScript (型 Love!)
参考:Shizuoka.jsでのLT資料
Agenda
● 方針
● アプリ概要
● 開発環境
● システム構成
● 処理概要
● 感想
方針
方針
以下の方針でシステムを作成する
● 基本パッケージのみを使用する(原則)
● 実施に動作するシステムを作る
● エラー処理も正しく書く
● 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)
エラー処理
● 関数の復帰値でerrorを返す
● 下位のモジュールのエラーをラップする場合は、
golang/x/xerrorsを使う
※1.13では標準パッケージに追加された
↑の方法で呼び出し元はエラーの種別をどうやって判
断すればよいのか?
xerrorsの使用例
func printData(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
Thank you for listening!
Renée French

More Related Content

Similar to golangでREST Serverを作ってみました。

Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
学 松崎
 
20111105 LL名古屋 俺と嫁のagiLe deveLopment
20111105 LL名古屋 俺と嫁のagiLe deveLopment20111105 LL名古屋 俺と嫁のagiLe deveLopment
20111105 LL名古屋 俺と嫁のagiLe deveLopmentRyo RKTM
 
Google Apps Script 概要
Google Apps Script 概要Google Apps Script 概要
Google Apps Script 概要
Y OCHI
 
フレームワーク使おうぜ!
フレームワーク使おうぜ!フレームワーク使おうぜ!
フレームワーク使おうぜ!
Takuya Sato
 
Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用
gree_tech
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Yuji Otani
 

Similar to golangでREST Serverを作ってみました。 (6)

Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
Spring Boot + Doma + AngularJSで作るERP #jjug_ccc #ccc_r12
 
20111105 LL名古屋 俺と嫁のagiLe deveLopment
20111105 LL名古屋 俺と嫁のagiLe deveLopment20111105 LL名古屋 俺と嫁のagiLe deveLopment
20111105 LL名古屋 俺と嫁のagiLe deveLopment
 
Google Apps Script 概要
Google Apps Script 概要Google Apps Script 概要
Google Apps Script 概要
 
フレームワーク使おうぜ!
フレームワーク使おうぜ!フレームワーク使おうぜ!
フレームワーク使おうぜ!
 
Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用Sumo Logic活用事例とその運用
Sumo Logic活用事例とその運用
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
 

More from kazuhisa kawashima

Win 3 aws certificate associate
Win 3 aws certificate associateWin 3 aws certificate associate
Win 3 aws certificate associate
kazuhisa kawashima
 
Win 3 aws certificate associate
Win 3 aws certificate associateWin 3 aws certificate associate
Win 3 aws certificate associate
kazuhisa kawashima
 
Scala.js
Scala.js Scala.js
How to work in Shizuoka
How to work in ShizuokaHow to work in Shizuoka
How to work in Shizuoka
kazuhisa kawashima
 
I love Shizuoka
I love ShizuokaI love Shizuoka
I love Shizuoka
kazuhisa kawashima
 
Why do you use java script
Why do you use  java script Why do you use  java script
Why do you use java script
kazuhisa kawashima
 

More from kazuhisa kawashima (6)

Win 3 aws certificate associate
Win 3 aws certificate associateWin 3 aws certificate associate
Win 3 aws certificate associate
 
Win 3 aws certificate associate
Win 3 aws certificate associateWin 3 aws certificate associate
Win 3 aws certificate associate
 
Scala.js
Scala.js Scala.js
Scala.js
 
How to work in Shizuoka
How to work in ShizuokaHow to work in Shizuoka
How to work in Shizuoka
 
I love Shizuoka
I love ShizuokaI love Shizuoka
I love Shizuoka
 
Why do you use java script
Why do you use  java script Why do you use  java script
Why do you use java script
 

Recently uploaded

JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 

Recently uploaded (9)

JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 

golangでREST Serverを作ってみました。