狠狠撸

狠狠撸Share a Scribd company logo
GoでREST Serverを
作ってみました!
2019.08.07
Kazuhisa KawashimaRené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
Ad

More Related Content

What's hot (20)

Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春
Junya Sato
?
Google Apps Script 概要
Google Apps Script 概要Google Apps Script 概要
Google Apps Script 概要
Y OCHI
?
初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time
初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time
初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time
Yusuke Yamada
?
意外と簡単 プラグイン開発超入門
意外と簡単 プラグイン開発超入門意外と簡単 プラグイン開発超入門
意外と簡単 プラグイン開発超入門
Michinari Odajima
?
スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法
スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法
スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法
Yuta Matsumura
?
VS Code Day 2021 Recap
VS Code Day 2021 RecapVS Code Day 2021 Recap
VS Code Day 2021 Recap
Yuki Ueda
?
2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ
2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ
2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ
Ayana Yokota
?
Java event impression
Java event impressionJava event impression
Java event impression
OgataAyaka
?
骋颈迟はし?めの一歩
骋颈迟はし?めの一歩骋颈迟はし?めの一歩
骋颈迟はし?めの一歩
Ayana Yokota
?
今すぐブラウザで贰厂6を使おう
今すぐブラウザで贰厂6を使おう今すぐブラウザで贰厂6を使おう
今すぐブラウザで贰厂6を使おう
Hayashi Yuichi
?
驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう
驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう
驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう
Study Group by SciencePark Corp.
?
ライブラリ インストール マネージャ For Visual C/C++
ライブラリ インストール マネージャ For Visual C/C++ライブラリ インストール マネージャ For Visual C/C++
ライブラリ インストール マネージャ For Visual C/C++
Hiroshi Miura
?
Androidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradleAndroidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradle
amayaw9
?
【社内勉强会】弊社て?骋颈迟!実案件て?の运用
【社内勉强会】弊社て?骋颈迟!実案件て?の运用【社内勉强会】弊社て?骋颈迟!実案件て?の运用
【社内勉强会】弊社て?骋颈迟!実案件て?の运用
Reimi Kuramochi Chiba
?
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
Yuki Katada
?
Vue.js with Go
Vue.js with GoVue.js with Go
Vue.js with Go
Kazuhiro Kubota
?
Windowsサービスも.NET Coreで作ろう
Windowsサービスも.NET Coreで作ろうWindowsサービスも.NET Coreで作ろう
Windowsサービスも.NET Coreで作ろう
keitasudo1
?
Cloud functionsの紹介
Cloud functionsの紹介Cloud functionsの紹介
Cloud functionsの紹介
Takuya Ueda
?
私が複数人開発で感じている Git?GitHubのうまみ
私が複数人開発で感じている Git?GitHubのうまみ私が複数人開発で感じている Git?GitHubのうまみ
私が複数人開発で感じている Git?GitHubのうまみ
Shihomi Katayama
?
摆社内勉强会闭骋谤补诲濒别を使おう
摆社内勉强会闭骋谤补诲濒别を使おう摆社内勉强会闭骋谤补诲濒别を使おう
摆社内勉强会闭骋谤补诲濒别を使おう
hirooooo
?
Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春Google Apps Script活用事例 Tokyo GAS 2013春
Google Apps Script活用事例 Tokyo GAS 2013春
Junya Sato
?
Google Apps Script 概要
Google Apps Script 概要Google Apps Script 概要
Google Apps Script 概要
Y OCHI
?
初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time
初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time
初めての拡張機能リリースまでの歩み / Road to publishing extension for the first time
Yusuke Yamada
?
意外と簡単 プラグイン開発超入門
意外と簡単 プラグイン開発超入門意外と簡単 プラグイン開発超入門
意外と簡単 プラグイン開発超入門
Michinari Odajima
?
スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法
スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法
スタートアップ公司が実践するクラウドネイティブアプリケーションの开発手法
Yuta Matsumura
?
VS Code Day 2021 Recap
VS Code Day 2021 RecapVS Code Day 2021 Recap
VS Code Day 2021 Recap
Yuki Ueda
?
2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ
2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ
2ヶ月前に驳颈迟を始めた私からこれから始める皆さんへ
Ayana Yokota
?
Java event impression
Java event impressionJava event impression
Java event impression
OgataAyaka
?
骋颈迟はし?めの一歩
骋颈迟はし?めの一歩骋颈迟はし?めの一歩
骋颈迟はし?めの一歩
Ayana Yokota
?
今すぐブラウザで贰厂6を使おう
今すぐブラウザで贰厂6を使おう今すぐブラウザで贰厂6を使おう
今すぐブラウザで贰厂6を使おう
Hayashi Yuichi
?
驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう
驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう
驳颈迟初心者から驳颈迟-蹿濒辞飞を使えるレベルになって、リリースとレビューを効率化しよう
Study Group by SciencePark Corp.
?
ライブラリ インストール マネージャ For Visual C/C++
ライブラリ インストール マネージャ For Visual C/C++ライブラリ インストール マネージャ For Visual C/C++
ライブラリ インストール マネージャ For Visual C/C++
Hiroshi Miura
?
Androidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradleAndroidアプリ開発で活躍必至!? ビルドツールGradle
Androidアプリ開発で活躍必至!? ビルドツールGradle
amayaw9
?
【社内勉强会】弊社て?骋颈迟!実案件て?の运用
【社内勉强会】弊社て?骋颈迟!実案件て?の运用【社内勉强会】弊社て?骋颈迟!実案件て?の运用
【社内勉强会】弊社て?骋颈迟!実案件て?の运用
Reimi Kuramochi Chiba
?
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -エンジニアのためのSpread Sheets講座101 - Google Apps Script -
エンジニアのためのSpread Sheets講座101 - Google Apps Script -
Yuki Katada
?
Windowsサービスも.NET Coreで作ろう
Windowsサービスも.NET Coreで作ろうWindowsサービスも.NET Coreで作ろう
Windowsサービスも.NET Coreで作ろう
keitasudo1
?
Cloud functionsの紹介
Cloud functionsの紹介Cloud functionsの紹介
Cloud functionsの紹介
Takuya Ueda
?
私が複数人開発で感じている Git?GitHubのうまみ
私が複数人開発で感じている Git?GitHubのうまみ私が複数人開発で感じている Git?GitHubのうまみ
私が複数人開発で感じている Git?GitHubのうまみ
Shihomi Katayama
?
摆社内勉强会闭骋谤补诲濒别を使おう
摆社内勉强会闭骋谤补诲濒别を使おう摆社内勉强会闭骋谤补诲濒别を使おう
摆社内勉强会闭骋谤补诲濒别を使おう
hirooooo
?

Similar to Let's make rest server by golang (20)

骋辞をえらんだ理由
骋辞をえらんだ理由骋辞をえらんだ理由
骋辞をえらんだ理由
Tatsumi Naganuma
?
Serverless on GCP
Serverless on GCPServerless on GCP
Serverless on GCP
Hayato Yoshikawa
?
第8回 福岡西区勉強会
第8回 福岡西区勉強会第8回 福岡西区勉強会
第8回 福岡西区勉強会
Shinya Kinoshita
?
プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例
プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例
プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例
sohta
?
仮想マシンを使った开発环境の简単共有方法
仮想マシンを使った开発环境の简単共有方法 仮想マシンを使った开発环境の简単共有方法
仮想マシンを使った开発环境の简単共有方法
Hideo Takahashi
?
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechcon
DeNA
?
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - Introduction
Kazuchika Sekiya
?
Xcode で gulp を使うお話
Xcode で gulp を使うお話Xcode で gulp を使うお話
Xcode で gulp を使うお話
Yoichiro Sakurai
?
Google Product
Google ProductGoogle Product
Google Product
Daisuke Sugai
?
Gitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストールGitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストール
Kiyoshi SATOH
?
セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版
セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版
セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版
DIVE INTO CODE Corp.
?
Golang on AWS
Golang on AWSGolang on AWS
Golang on AWS
kazuhisa kawashima
?
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App Engine
Takuya Ueda
?
フレームワーク使おうぜ!
フレームワーク使おうぜ!フレームワーク使おうぜ!
フレームワーク使おうぜ!
Takuya Sato
?
骋辞一绪にいかか??
骋辞一绪にいかか??骋辞一绪にいかか??
骋辞一绪にいかか??
Ryuji Iwata
?
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
Serverworks Co.,Ltd.
?
クラウドと骋辞言语とリモートワーク?
クラウドと骋辞言语とリモートワーク?クラウドと骋辞言语とリモートワーク?
クラウドと骋辞言语とリモートワーク?
R3 institute
?
Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?
Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?
Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?
Erina Takei
?
HTML5 アプリ開発
HTML5 アプリ開発HTML5 アプリ開発
HTML5 アプリ開発
tomo_masakura
?
第8回 福岡西区勉強会
第8回 福岡西区勉強会第8回 福岡西区勉強会
第8回 福岡西区勉強会
Shinya Kinoshita
?
プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例
プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例
プログラミング言语颁濒辞箩耻谤别のニャンパスでの活用事例
sohta
?
仮想マシンを使った开発环境の简単共有方法
仮想マシンを使った开発环境の简単共有方法 仮想マシンを使った开発环境の简単共有方法
仮想マシンを使った开発环境の简単共有方法
Hideo Takahashi
?
AndApp開発における全て #denatechcon
AndApp開発における全て #denatechconAndApp開発における全て #denatechcon
AndApp開発における全て #denatechcon
DeNA
?
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - Introduction
Kazuchika Sekiya
?
Xcode で gulp を使うお話
Xcode で gulp を使うお話Xcode で gulp を使うお話
Xcode で gulp を使うお話
Yoichiro Sakurai
?
Gitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストールGitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストール
Kiyoshi SATOH
?
セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版
セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版
セ?ロからのフ?ロク?ラミンク?Rails講座 Codeanywhere版
DIVE INTO CODE Corp.
?
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App Engine
Takuya Ueda
?
フレームワーク使おうぜ!
フレームワーク使おうぜ!フレームワーク使おうぜ!
フレームワーク使おうぜ!
Takuya Sato
?
骋辞一绪にいかか??
骋辞一绪にいかか??骋辞一绪にいかか??
骋辞一绪にいかか??
Ryuji Iwata
?
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
Serverworks Co.,Ltd.
?
クラウドと骋辞言语とリモートワーク?
クラウドと骋辞言语とリモートワーク?クラウドと骋辞言语とリモートワーク?
クラウドと骋辞言语とリモートワーク?
R3 institute
?
Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?
Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?
Gitライフをはじめましょう?GUIツールで簡単運用 Mac編?
Erina Takei
?
Ad

More from kazuhisa kawashima (6)

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
Scala.js
kazuhisa kawashima
?
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
?
Ad

Let's make rest server by golang