狠狠撸

狠狠撸Share a Scribd company logo
Golang こんな時どうする?
Yusuke Komatsu
2016-10-04.?
DMM.comラボ & eureka &
インテリジェンス合同 Go言語勉強会
NULLを許容するDBやJSONって
どうしよう?
? ポインタを使う
? sqlパッケージの型を使う(sql.NullString とか)
? NULLなにそれ?おいしいの?
sql.Null** を使った場合
? sqlパッケージの中で実装されている
? Nil判定もできるし、実態となる型はそのまま?
(Int64ならInt64で値が格納されている)
? Scanを通せばある程度ゆるく解釈してくれる
? 1変数内(構造体)に2つのパラメータが格納されてい
て、両方見ないと値を取得できない
利点
欠点
ポインタを使った場合
? 数値や文字列などと一緒にNilを使える
? Nilを区別しないで使うことができる
? 通常の型として扱うには元に戻す必要がある
? JsonなどをDecodeする時にゆるい解釈ができない?
(IntをStringとして解釈するなど)
利点
欠点
NULLを許容問題はRDBだけじゃない
? 他のデータベースやキャッシュする際も考慮が必要
? jsonやXMLなどでも使う(特にAPI)
? 他言語のプログラムと通信する場合も考える必要があ
る
便利な独自型つくりました
闯厂翱狈の贰苍肠辞诲别/顿别肠辞诲别が直感的
同じ値でも蝉别迟する型によって柔软に解釈
実は某社のAPIのレスポンスで事故ったので作った
? 複数のサービスのデータを取りまとめられていて、サービスごとに型が
バラバラ
? int型のパラメータにstring型が混ざっていたりする
? APIもPHPで、型やハッシュor配列判定を勝手に吸収して出力されている
? 静的言語にとっては死亡フラグ
こんな感じだったので
またこんなことが起きても対処できるように作りました
genericはいろんな方のいいとこ取り
? Scanが定義されているのでsqlパッケージでも意識せず使える
? MarshalJSON / UnmarshalJSONを定義してるのでEncode/Decode時のNULL
は自動的に考慮される
? Set関数をつかえば、Nilを考えずに変数に値をセットできる
? Value関数を使えば、1つだけ値が返ってくる(Nilの場合はNilが返ってくる)
? 型判定の柔軟さはPHP並
? re?ectはエラー時のみしか使ってない
? sql.Null**型でやっているようなNULL判定も可能
実はGo 2系でGenericsが実装されるかも
http.Response.Body
消失問題しってますか?
? http.Response.Bodyを使いまわそうとしても1度
使うと空のio.ReadCloserになってしまう
? 変数に入れ直しても変数も消える
こんなことはできません
こうしたら解决できる
みなさんテストってどうしてます?
? とりあえずgo test?カバレッジとってる?
? ソースの品質管理(担保)ってどうしてます?
? そもそもテストしてますか?
リポジトリ内の全パッケージをテストしたい
? リポジトリのルートディレクトリから再帰的にテスト
? vendorディレクトリ配下はテストしたくない(glide nv)
? 品質管理のためにカバレッジも取りたい(coverpro?le)
go test $(glide nv) -coverpro?le=coverage.out
ERROR:
cannot use test pro?le ?ag
with multiple packages
リポジトリ内の全パッケージをテストしたい
ROOT_PATH="$GOPATH/src/seeds.rickcloud.jp/bitbucket/scm/hm/wage"
COV_PARTIAL_FILE=pro?le.cov.out
COV_FILE=pro?le-all.cov.out
COV_MODE=count
HEADER="mode: $COV_MODE"
cd $ROOT_PATH; 
# テスト用DBのマイグレーション
goose -env testing up; 
echo "mode: count" > $COV_FILE
# ひつようのないディレクトリを除いたディレクトリを再帰的にチェック
for dir in $(?nd . -maxdepth 10 -not -path './.git*' 
-not -path '*/_*' -not -path './cmd' -not -path './release*' 
-not -path './vendor*' -type d)
do
if ls $dir/*.go &> /dev/null; then
# 個々にテストをして一時保存用プロフィールに保存
go test -v -covermode=count -coverpro?le=$dir/$COV_PARTIAL_FILE $dir
if [ -f $dir/$COV_PARTIAL_FILE ]; then
# 一時保存されたものを出力用プロファイルに転記
cat $dir/$COV_PARTIAL_FILE | tail -n +2 >> $COV_FILE
rm $dir/$COV_PARTIAL_FILE
?
?
done
# テスト用DBのロールバック
goose -env testing down;
ソースコードの品质管理
? gofmt (インストール不要)?
ソースコードを整形する
? go_vet (インストール不要)?
コンパイルエラーにならないヒューリスティックな問題を検出する
? gocyclo (https://github.com/fzipp/gocyclo)?
循環的複雑度(コードの複雑性)の検証をする
? glint (https://github.com/golang/lint)?
Golangのlinter
? ine?assign (https://github.com/gordonklaus/ine?assign)?
無駄な割当を検出する
? misspell (https://github.com/client9/misspell)?
スペルミスを検出する
ソースコードの品质管理
ソースコードの品质管理
THANK YOU!!
[generics]
? usk81/generic
https://github.com/usk81/generic
? proposal: generic programming facilities
https://github.com/golang/go/issues/15292
[test]
? Go Report Card
https://goreportcard.com
Ad

Recommended

MonotaRO LT - ESLintの仕組み
MonotaRO LT - ESLintの仕組み
株式会社MonotaRO Tech Team
?
碍辞迟濒颈苍について学んだコト
碍辞迟濒颈苍について学んだコト
iPride Co., Ltd.
?
闯补惫补蝉肠谤颈辫迟勉强会资料1
闯补惫补蝉肠谤颈辫迟勉强会资料1
Kenji Kaneko
?
どう見る?Class Reference
どう見る?Class Reference
Tadahisa Motooka
?
Doma2 with Kotlin
Doma2 with Kotlin
yy yank
?
厂肠补濒补で萌える関数型プログラミング摆1.1.搁颁1闭
厂肠补濒补で萌える関数型プログラミング摆1.1.搁颁1闭
Ra Zon
?
[Golang] 骋辞言语て?サーヒ?ス作ってる话
[Golang] 骋辞言语て?サーヒ?ス作ってる话
株式会社驰贰叠滨厂.齿驰窜
?
「技术のインテリジェンスを创る」をどうやって実现するか
「技术のインテリジェンスを创る」をどうやって実现するか
Yuji Otani
?
罢补濒办苍辞迟别と骋辞濒补苍驳
罢补濒办苍辞迟别と骋辞濒补苍驳
leverages_event
?
関数型?オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型?オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
?
骋辞言语による飞别产アフ?リの作り方
骋辞言语による飞别产アフ?リの作り方
Yasutaka Kawamoto
?
骋辞入门
骋辞入门
Takuya Ueda
?
【初心者向け】骋辞言语勉强会资料
【初心者向け】骋辞言语勉强会资料
Yuji Otani
?
骋辞による奥别产アプリ开発のキホン
骋辞による奥别产アプリ开発のキホン
Akihiko Horiuchi
?
Couchbase server入門
Couchbase server入門
Yusuke Komatsu
?
Monitoring of SmartNews
Monitoring of SmartNews
Nobutoshi Ogata
?
Embulk makes Japan visible
Embulk makes Japan visible
Kai Sasaki
?
Go x Slack API
Go x Slack API
weddingpark
?
开発者による现実的な自动化テスト及び搁耻产测のテストツールについて
开発者による现実的な自动化テスト及び搁耻产测のテストツールについて
Takaaki Kasai
?
Grafana datasource plugin
Grafana datasource plugin
Mitsuhiro Tanda
?
言语の検証と导入
言语の検証と导入
weddingpark
?
顿辞肠办别谤の基本的な话
顿辞肠办别谤の基本的な话
gree_tech
?
[GREE Tech Talk#10] ネットワークの可視化
[GREE Tech Talk#10] ネットワークの可視化
gree_tech
?
グリーで行われている勉強会とその特徴 ? 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ? 勉強会を主催してみた話
gree_tech
?
HighBatch
HighBatch
Nobuhito Sato
?
alphawing meets heroku
alphawing meets heroku
Kyosuke Kameda
?
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
Mikiya Okuno
?
Effective JavaScript Ch.1
Effective JavaScript Ch.1
Teppei Sato
?

More Related Content

Viewers also liked (20)

[Golang] 骋辞言语て?サーヒ?ス作ってる话
[Golang] 骋辞言语て?サーヒ?ス作ってる话
株式会社驰贰叠滨厂.齿驰窜
?
「技术のインテリジェンスを创る」をどうやって実现するか
「技术のインテリジェンスを创る」をどうやって実现するか
Yuji Otani
?
罢补濒办苍辞迟别と骋辞濒补苍驳
罢补濒办苍辞迟别と骋辞濒补苍驳
leverages_event
?
関数型?オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型?オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
?
骋辞言语による飞别产アフ?リの作り方
骋辞言语による飞别产アフ?リの作り方
Yasutaka Kawamoto
?
骋辞入门
骋辞入门
Takuya Ueda
?
【初心者向け】骋辞言语勉强会资料
【初心者向け】骋辞言语勉强会资料
Yuji Otani
?
骋辞による奥别产アプリ开発のキホン
骋辞による奥别产アプリ开発のキホン
Akihiko Horiuchi
?
Couchbase server入門
Couchbase server入門
Yusuke Komatsu
?
Monitoring of SmartNews
Monitoring of SmartNews
Nobutoshi Ogata
?
Embulk makes Japan visible
Embulk makes Japan visible
Kai Sasaki
?
Go x Slack API
Go x Slack API
weddingpark
?
开発者による现実的な自动化テスト及び搁耻产测のテストツールについて
开発者による现実的な自动化テスト及び搁耻产测のテストツールについて
Takaaki Kasai
?
Grafana datasource plugin
Grafana datasource plugin
Mitsuhiro Tanda
?
言语の検証と导入
言语の検証と导入
weddingpark
?
顿辞肠办别谤の基本的な话
顿辞肠办别谤の基本的な话
gree_tech
?
[GREE Tech Talk#10] ネットワークの可視化
[GREE Tech Talk#10] ネットワークの可視化
gree_tech
?
グリーで行われている勉強会とその特徴 ? 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ? 勉強会を主催してみた話
gree_tech
?
HighBatch
HighBatch
Nobuhito Sato
?
alphawing meets heroku
alphawing meets heroku
Kyosuke Kameda
?
「技术のインテリジェンスを创る」をどうやって実现するか
「技术のインテリジェンスを创る」をどうやって実现するか
Yuji Otani
?
罢补濒办苍辞迟别と骋辞濒补苍驳
罢补濒办苍辞迟别と骋辞濒补苍驳
leverages_event
?
関数型?オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型?オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
Tadahiro Ishisaka
?
骋辞言语による飞别产アフ?リの作り方
骋辞言语による飞别产アフ?リの作り方
Yasutaka Kawamoto
?
【初心者向け】骋辞言语勉强会资料
【初心者向け】骋辞言语勉强会资料
Yuji Otani
?
骋辞による奥别产アプリ开発のキホン
骋辞による奥别产アプリ开発のキホン
Akihiko Horiuchi
?
Embulk makes Japan visible
Embulk makes Japan visible
Kai Sasaki
?
开発者による现実的な自动化テスト及び搁耻产测のテストツールについて
开発者による现実的な自动化テスト及び搁耻产测のテストツールについて
Takaaki Kasai
?
言语の検証と导入
言语の検証と导入
weddingpark
?
顿辞肠办别谤の基本的な话
顿辞肠办别谤の基本的な话
gree_tech
?
[GREE Tech Talk#10] ネットワークの可視化
[GREE Tech Talk#10] ネットワークの可視化
gree_tech
?
グリーで行われている勉強会とその特徴 ? 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ? 勉強会を主催してみた話
gree_tech
?

Similar to 20161004 DMM/エウレカ/インテリジェンス合同勉強会 (9)

あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
Mikiya Okuno
?
Effective JavaScript Ch.1
Effective JavaScript Ch.1
Teppei Sato
?
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
snicker_jp
?
碍辞迟濒颈苍アンチパターン
碍辞迟濒颈苍アンチパターン
Recruit Lifestyle Co., Ltd.
?
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0
Goichi Hirakawa
?
こわくない厂肠补濒补
こわくない厂肠补濒补
Kota Mizushima
?
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Kazuhiro Sera
?
あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
Mikiya Okuno
?
Effective JavaScript Ch.1
Effective JavaScript Ch.1
Teppei Sato
?
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
snicker_jp
?
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0
Goichi Hirakawa
?
こわくない厂肠补濒补
こわくない厂肠补濒补
Kota Mizushima
?
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Kazuhiro Sera
?
Ad

20161004 DMM/エウレカ/インテリジェンス合同勉強会