SlideShare a Scribd company logo
1 of 21
Download to read offline
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)
• 他言語のプログラムと通信する場合も考える必要があ
る
便利な独自型つくりました
JSONのEncode/Decodeが直感的
同じ値でもsetする型によって柔軟に解釈
実は某社のAPIのレスポンスで事故ったので作った
• 複数のサービスのデータを取りまとめられていて、サービスごとに型が
バラバラ
• int型のパラメータにstring型が混ざっていたりする
• APIもPHPで、型やハッシュor配列判定を勝手に吸収して出力されている
• 静的言語にとっては死亡フラグ
こんな感じだったので
またこんなことが起きても対処できるように作りました
genericはいろんな方のいいとこ取り
• Scanが定義されているのでsqlパッケージでも意識せず使える
• MarshalJSON / UnmarshalJSONを定義してるのでEncode/Decode時のNULL
は自動的に考慮される
• Set関数をつかえば、Nilを考えずに変数に値をセットできる
• Value関数を使えば、1つだけ値が返ってくる(Nilの場合はNilが返ってくる)
• 型判定の柔軟さはPHP並
• reflectはエラー時のみしか使ってない
• sql.Null**型でやっているようなNULL判定も可能
実はGo 2系でGenericsが実装されるかも
http.Response.Body
消失問題しってますか?
• http.Response.Bodyを使いまわそうとしても1度
使うと空のio.ReadCloserになってしまう
• 変数に入れ直しても変数も消える
こんなことはできません
こうしたら解決できる
みなさんテストってどうしてます?
• とりあえずgo test?カバレッジとってる?
• ソースの品質管理(担保)ってどうしてます?
• そもそもテストしてますか?
リポジトリ内の全パッケージをテストしたい
• リポジトリのルートディレクトリから再帰的にテスト
• vendorディレクトリ配下はテストしたくない(glide nv)
• 品質管理のためにカバレッジも取りたい(coverprofile)
go test $(glide nv) -coverprofile=coverage.out
ERROR:
cannot use test profile flag
with multiple packages
リポジトリ内の全パッケージをテストしたい
ROOT_PATH="$GOPATH/src/seeds.rickcloud.jp/bitbucket/scm/hm/wage"
COV_PARTIAL_FILE=profile.cov.out
COV_FILE=profile-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 $(find . -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 -coverprofile=$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
fi
fi
done
# テスト用DBのロールバック
goose -env testing down;
ソースコードの品質管理
• gofmt (インストール不要)

ソースコードを整形する
• go_vet (インストール不要)

コンパイルエラーにならないヒューリスティックな問題を検出する
• gocyclo (https://github.com/fzipp/gocyclo)

循環的複雑度(コードの複雑性)の検証をする
• glint (https://github.com/golang/lint)

Golangのlinter
• ineffassign (https://github.com/gordonklaus/ineffassign)

無駄な割当を検出する
• 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

More Related Content

Viewers also liked

[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話株式会社YEBIS.XYZ
 
「技術のインテリジェンスを創る」をどうやって実現するか
「技術のインテリジェンスを創る」をどうやって実現するか「技術のインテリジェンスを創る」をどうやって実現するか
「技術のインテリジェンスを創る」をどうやって実現するかYuji Otani
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門Tadahiro Ishisaka
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Yasutaka Kawamoto
 
【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料Yuji Otani
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
Couchbase server入門
Couchbase server入門Couchbase server入門
Couchbase server入門Yusuke Komatsu
 
Embulk makes Japan visible
Embulk makes Japan visibleEmbulk makes Japan visible
Embulk makes Japan visibleKai Sasaki
 
開発者による現実的な自動化テスト及びRubyのテストツールについて
開発者による現実的な自動化テスト及びRubyのテストツールについて開発者による現実的な自動化テスト及びRubyのテストツールについて
開発者による現実的な自動化テスト及びRubyのテストツールについてTakaaki Kasai
 
Grafana datasource plugin
Grafana datasource pluginGrafana datasource plugin
Grafana datasource pluginMitsuhiro Tanda
 
言語の検証と導入
言語の検証と導入言語の検証と導入
言語の検証と導入weddingpark
 
Dockerの基本的な話
Dockerの基本的な話Dockerの基本的な話
Dockerの基本的な話gree_tech
 
[GREE Tech Talk#10] ネットワークの可視化
[GREE Tech Talk#10] ネットワークの可視化[GREE Tech Talk#10] ネットワークの可視化
[GREE Tech Talk#10] ネットワークの可視化gree_tech
 
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話gree_tech
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets herokuKyosuke Kameda
 

Viewers also liked (20)

[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話
 
「技術のインテリジェンスを創る」をどうやって実現するか
「技術のインテリジェンスを創る」をどうやって実現するか「技術のインテリジェンスを創る」をどうやって実現するか
「技術のインテリジェンスを創る」をどうやって実現するか
 
TalknoteとGolang
TalknoteとGolangTalknoteとGolang
TalknoteとGolang
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 
Go入門
Go入門Go入門
Go入門
 
【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
Couchbase server入門
Couchbase server入門Couchbase server入門
Couchbase server入門
 
Monitoring of SmartNews
Monitoring of SmartNewsMonitoring of SmartNews
Monitoring of SmartNews
 
Embulk makes Japan visible
Embulk makes Japan visibleEmbulk makes Japan visible
Embulk makes Japan visible
 
Go x Slack API
Go x Slack APIGo x Slack API
Go x Slack API
 
開発者による現実的な自動化テスト及びRubyのテストツールについて
開発者による現実的な自動化テスト及びRubyのテストツールについて開発者による現実的な自動化テスト及びRubyのテストツールについて
開発者による現実的な自動化テスト及びRubyのテストツールについて
 
Grafana datasource plugin
Grafana datasource pluginGrafana datasource plugin
Grafana datasource plugin
 
言語の検証と導入
言語の検証と導入言語の検証と導入
言語の検証と導入
 
Dockerの基本的な話
Dockerの基本的な話Dockerの基本的な話
Dockerの基本的な話
 
[GREE Tech Talk#10] ネットワークの可視化
[GREE Tech Talk#10] ネットワークの可視化[GREE Tech Talk#10] ネットワークの可視化
[GREE Tech Talk#10] ネットワークの可視化
 
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
グリーで行われている勉強会とその特徴 ✕ 勉強会を主催してみた話
 
HighBatch
HighBatchHighBatch
HighBatch
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets heroku
 

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

あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルあなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルMikiya Okuno
 
Effective JavaScript Ch.1
Effective JavaScript Ch.1Effective JavaScript Ch.1
Effective JavaScript Ch.1Teppei Sato
 
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」snicker_jp
 
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0Goichi Hirakawa
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekKazuhiro Sera
 

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

あなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデルあなたが知らない リレーショナルモデル
あなたが知らない リレーショナルモデル
 
Effective JavaScript Ch.1
Effective JavaScript Ch.1Effective JavaScript Ch.1
Effective JavaScript Ch.1
 
Tokyo.R #22 LT
Tokyo.R #22 LTTokyo.R #22 LT
Tokyo.R #22 LT
 
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
Splunk_NiteX 「ノンテクエンジニアでも、デキる!ログ解析」
 
Kotlinアンチパターン
KotlinアンチパターンKotlinアンチパターン
Kotlinアンチパターン
 
New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0New Objective-C Features for Swift 2.0
New Objective-C Features for Swift 2.0
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageekJava エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
Java エンジニアチームが始めやすい Scala コーディングスタイル #ichigayageek
 

Recently uploaded

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (7)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

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