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

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (12)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

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