SlideShare ist ein Scribd-Unternehmen logo
1 von 27
Downloaden Sie, um offline zu lesen
@k_nishijima
SI案件で
Go言語を使ってみた!
1
第5回Golang勉強会 in Okinawa
2017年3月25日 @k_nishijima
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0 Attributions license.
@k_nishijima
GoCon 2017 Spring
行きたかった!
#gocon
で盛り上がってます。
悔しいので同日開催で沖縄で(^^)
2
@k_nishijima
今回は
「SI案件でGo言語使ってみた」
ということでご報告します。
3
@k_nishijima
あんた誰?
4
西島 幸一郎 / にしじま こういちろう

アールスリーインスティテュート ソリューションアーキテクト
https://www.r3it.com

大阪の会社に所属、宜野湾の自宅から100%リモートワーク
okinawa.goのコアメンバー
JAWS−UG沖縄のコアメンバー
ハッカーズチャンプルー実行委員長
ご質問などあればFacebook/Twitterなどでお気軽に〜♪
@k_nishijima
nishijima.koichiro
@k_nishijima
Agenda

✓ Good or Bad つまりKPT

✓ そこから得たTIPSを共有!

質問は随時その場で、資料はもちろん後でアップします。

✓ 悩み・問題については、いい方法教えてくださいm(_ _)m
5
@k_nishijima
投入した案件概要
6
@k_nishijima 7
今聞いたことは
全部忘れて!
@k_nishijima
なんとなくのシステム構成
8
基盤部分
worker1 worker2
AWS
(Lambda/DynamoDB/SNS)
外部システム
外部システム
job job job job
@k_nishijima
よかったこと・悪かったこと
9
๏ ここからは隠し事無しで(^_^;

๏ とりあえず反省点は色々あるので

先にそれから取り上げます
@k_nishijima
データアクセスレイヤをはっきりと

分離したほうが良かったかも
10
๏ ライブラリは割と簡単に呼べるので、各関数が気軽に呼んじゃう
๏ データストアに関連したポリシー振る舞いを変更したい場合、各関数
が呼んでると修正が広域にわたったりする
データストア
外部システム
関数A
関数B
関数C
ここに
DAOが
居たほうがいい?
@k_nishijima
引数に構造体を(常に)
適用しても良かったかも
11
> func CreateThumbnail(key string, width int) error {}



これはこれで問題ないけど、場合によってはリクエスト/レスポンスを

構造体にしておくと、引数の追加やデフォルト引数、

メソッド追加などで変化に対応しやすくなる(が、コードは増える(^_^;)

> type CreateThumbnailRequest struct {
> Key string
> Width int
> }
> func CreateThumbnail(r CreateThumbnailRequest) CreateThumbnailResult {}
@k_nishijima
コンストラクタも(基本的には)
付けたほうが良かった
12
๏ worker := NewFooWorker() なのか

worker := FooWorker{} なのか

迷う時間が無駄

๏ 複雑な初期化処理が必要な場合、後者だと困る
@k_nishijima
テスト関数名に
ルールが必要だったかも
13
๏ go test -v -run テスト関数名

でいつも1関数ずつ実行していた

(名前が前方一致というのは知ってた)
๏ 1ファイル内にテスト関数が膨大になって、はたと気づいた・・・
@k_nishijima
作った!
https://gist.github.com/k-nishijima/
dc148acc22565f617582d20c0dc5ec88
これはファイルにするのを前提にしてるけど、
直接実行も出来るし、IDEとかでそういうプラ
グインもある気がする。
ast超便利っぽい!
14
@k_nishijima
エラーハンドリングの

方針について
15
๏ 言語のエラーと、ビジネス上のエラーハンドリングの違い
if err != nil { return err }
if err != nil { return err }
オレが王様
if err != nil { return err } エラーがあったら戻るんだけど、、、
ビジネスロジック、
もしくは設定によっては
この辺で打ち切って止めたい、とか
「おおそうか、くるしゅうない」
@k_nishijima
こういうときは
禁断のpanicか?
(+deferで終了処理?)
16
@k_nishijima
reflectは魔法。ただし…
17
๏ 読み込む先/書き込む先が

空だったら/ポインタだったらどうする?

๏ panicは嫌じゃ(;_;)
@k_nishijima
「値のない」の値の扱い
18
๏ 空(nil)なのか、空文字なのか、

それとも別の特定の初期値なのか

๏ それらをJSON/XMLに書き出すときに、

どういった形で書き出すのか、書き出さないのか
@k_nishijima
と言うことで色々ありました
19
๏ だんだんココロが痛くなってきたので、

そろそろ良かったことに…
@k_nishijima
一番(?)良かったこと
20
๏ 管理者向けCLIをサクッと作れた!

(お客さんのWindows環境向け)

๏ 社内でGoを書く人が増えた!
@k_nishijima
構造体のシリアライズ便利
21
> msgJson, err := json.Marshal(&msg)

と
> err := json.Unmarshal(byteArray, &msg)
๏ 基本的に AWS Lambda は関数単位でデプロイ
/呼び出しなので、メッセージが飛び交う
@k_nishijima
interfaceとswitch便利
22
> switch s := source.(type) {
> case FooBarType:
> // ここでsはFooBarType型として使える
> }
@k_nishijima
空の構造体とmapの存在確認
23
> m := map[string]struct{}{}

とかやっといて
> if _, ok := m[key]; ok {

// あったら何かする、みたいな

}
@k_nishijima
定数の定義(ちと面倒)
24
> type TargetSystem int
> const (
> TargetA TargetSystem = iota + 1
> TargetB
> TargetC
> )
> func (t TargetSystem) String() string {
> switch t {
> case TargetA:
> return "AAA"
> case TargetB:
> return "BBB"
> case TargetC:
> return "CCC"
> }
> return "unknown"
> }
> func NewTargetSystem(target string) TargetSystem {
> switch target {
> case "AAA":
> return TargetA
> case "BBB":
> return TargetB
> case "CCC":
> return TargetC
> }
> return TargetA
> }
@k_nishijima
動的なJSON/XMLの扱い
25
> func (u *オレの型) MarshalXML(e *xml.Encoder,
start xml.StartElement) error {}



みたいに独自型の

MarshalXML/UnmarshalXML をゴリゴリ実装
@k_nishijima
色々あるけど
Go楽しいです!
以上♪
26
@k_nishijima
この夏のイベント情報!
27
๏ 4月29日(土) JAWS-UG沖縄 Cloud on the Beach 2017

https://jaws-ug-okinawa.doorkeeper.jp/events/58874

クレカなし・無料でAWS使えるハンズオンやります♪もちろんビーパも!
๏ 6月24日(土) ハッカーズチャンプルー2017

http://hackers-champloo.org/2017/

登壇者公募中!

Weitere ähnliche Inhalte

Andere mochten auch

G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...
G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...
G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...
Takehiko Ito
 

Andere mochten auch (20)

Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
HoloLens x Graphics 入門
HoloLens x Graphics 入門HoloLens x Graphics 入門
HoloLens x Graphics 入門
 
goimagick-syokai-II
goimagick-syokai-IIgoimagick-syokai-II
goimagick-syokai-II
 
20170325 institute of-vulnerability_assessment
20170325 institute of-vulnerability_assessment20170325 institute of-vulnerability_assessment
20170325 institute of-vulnerability_assessment
 
Go conference 2017 Lightning talk
Go conference 2017 Lightning talkGo conference 2017 Lightning talk
Go conference 2017 Lightning talk
 
ドローン農業最前線
ドローン農業最前線ドローン農業最前線
ドローン農業最前線
 
動的最適化の今までとこれから
動的最適化の今までとこれから動的最適化の今までとこれから
動的最適化の今までとこれから
 
kintone Café Akita Vol.1 対面開発
kintone Café Akita Vol.1 対面開発kintone Café Akita Vol.1 対面開発
kintone Café Akita Vol.1 対面開発
 
粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法粗探しをしてGoのコントリビューターになる方法
粗探しをしてGoのコントリビューターになる方法
 
勾配降下法の 最適化アルゴリズム
勾配降下法の最適化アルゴリズム勾配降下法の最適化アルゴリズム
勾配降下法の 最適化アルゴリズム
 
ある工場の Redmine バージョンアップ
ある工場の Redmine バージョンアップある工場の Redmine バージョンアップ
ある工場の Redmine バージョンアップ
 
Autostima in 140 caratteri: la recensione a 5 stelle di Egidio su Amazon!
Autostima in 140 caratteri: la recensione a 5 stelle di Egidio su Amazon!Autostima in 140 caratteri: la recensione a 5 stelle di Egidio su Amazon!
Autostima in 140 caratteri: la recensione a 5 stelle di Egidio su Amazon!
 
入門系の本を一冊も読まずにデータサイエンスに入門してみる
入門系の本を一冊も読まずにデータサイエンスに入門してみる入門系の本を一冊も読まずにデータサイエンスに入門してみる
入門系の本を一冊も読まずにデータサイエンスに入門してみる
 
Tomcatx performance-tuning
Tomcatx performance-tuningTomcatx performance-tuning
Tomcatx performance-tuning
 
G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...
G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...
G266 堀 恭子・いとうたけひこ・安藤孝敏 (2017, 3月). 学校飼育動物作文のテキストマイニング:命の大切さと動物への愛着に焦点をあてて 第28...
 
Parquet performance tuning: the missing guide
Parquet performance tuning: the missing guideParquet performance tuning: the missing guide
Parquet performance tuning: the missing guide
 
Why Smart Brands use Characters
Why Smart Brands use CharactersWhy Smart Brands use Characters
Why Smart Brands use Characters
 
Appear.in premium walkthrough
Appear.in premium walkthroughAppear.in premium walkthrough
Appear.in premium walkthrough
 
kintoneの検索高速化への取り組み
kintoneの検索高速化への取り組みkintoneの検索高速化への取り組み
kintoneの検索高速化への取り組み
 

Si案件でGo言語を使ってみた!