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

開発者による現実的な自動化テスト及びRubyのテストツールについて
開発者による現実的な自動化テスト及びRubyのテストツールについて開発者による現実的な自動化テスト及びRubyのテストツールについて
開発者による現実的な自動化テスト及びRubyのテストツールについて
Takaaki Kasai
 

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/エウレカ/インテリジェンス合同勉強会 (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

Recently uploaded (12)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 

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