attention: in this case go version 1.10.x
Go guideline
In our case.
go setup
Go install
https://golang.org/dl/
- If you want to use a different version, use a symbolic link or mod $PATH.
$ mv [downloadPath]/[downloadPKG] $HOME/
$ tar -xzf [downloadPKG]
$ mv go/ go1.xx.x
path setting
$ mkdir $HOME/go
$ echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
$ echo 'export GOROOT=$HOME/go1.xx.x' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$GOROOT/bin' >> ~/.bash_profile
$ source ~/.bash_profile
$ go version // check
go version goX.XX.X darwin/amd64
github clone dir
$GOPATH/src/github.com/[username]/[appname]
$ cd $GOPATH/src
$ mkdir -p XXX/AAA/DDD
$ git clone XXX/AAA/DDD XXX/AAA/DDD
text editor
vim?
VScode?
JetBrains?
...as you like!
tutorial
GHE rule
easy Git-flow.
You know, right?
branchs
- master
- staging
- develop
- feature/*
- hotfixes/*
Don't do it! :
rebase
git push -f
=======================================
ここからにほんご。
いろんな文化のよいとこ取り入れていきたい。
PR rule
わからない・知らないものほど積極的に参加し、わかりみ深めましょう。
みんな自分のタスクを抱えています。レビューし易いPRを心がけましょう。
例)モデル部分だけ、特定ロジックだけ等、粒度に気をつける。
- 件名
- 成果物の名前等、わかりやすいものにする
- 説明
- [#{数字}]で対応Issueを明記
- Labels
- 必要に応じて選択
- Milestone
- 対象のフェーズを選択
styleGuide
- 前提として、
gofmt
,goimports
,golint
を使用してPUSHすること(Editorプラグイン推奨) - Go Code Review Comments
パッケージ依存解決ツール
【~1.10.x】
go get
しない。
golang/depつかう。
【1.11.x~】
GoModulesつかおう。
イディオム
- 宣言のグルーピング
-
const
やvar
をカッコでグルーピングする際、用途などで個別にグルーピングすること -
struct
やinterface
はネストせず、定義を分割すること
-
- 関数のparamは迷ったらポインタ渡しにする
- フィールド増えてもパフォーマンス落ちない
- パース用の構造体など、共通で使うpackageはimportを減らす。
- トランザクションなどの定型処理は匿名関数使おう。いけてる例
ログ・エラーハンドリング
- err.Error()を分岐に使うのは止めよう
- ログ出力は(出来る限り)各ハンドラーのトップレベルの関数
func(w http.ResponseWriter, r *http.Request)
で行うこと - あちこちでログだすの止めよう
- 下位の関数でエラーが発生した場合、ラップしてから上位の関数へエラーを返す
- ラップすることでエラーが発生したファイルや行数を記憶してくれるため、上位の関数でログ出力してもエラーの発生箇所を特定できる
- ラップ時に利用するパッケージ
- ラップの記述方法:
errors.Wrap(err, "error message")
- ロガーはclogなどを用い、POST特定用にリクエストIDなどあると望ましい。
スレッドセーフ
- 複数のgoroutineで同一の変数を読み書きする際にはチャネルを使って同期をとったり、ロック
sync.Mutex
を使って排他制御をすること
Test
- 疎結合を意識しよう
- 外部と接続する設定を切り替え(envファイルなど)
- 外部と接続するクライアントを切り替え(gomockなど)
- 外部と接続する処理を切り替え(interface)
- 可能な限りTableDrivenTestsの形式で記述すること(可読性がよくなるため)