LoginSignup
3
1

More than 3 years have passed since last update.

Golangガイドライン 1.10系

Last updated at Posted at 2019-06-06

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

パッケージ依存解決ツール

【~1.10.x】
go getしない。
golang/depつかう。

【1.11.x~】
GoModulesつかおう。

イディオム

  • 宣言のグルーピング
    • constvarをカッコでグルーピングする際、用途などで個別にグルーピングすること
    • structinterfaceはネストせず、定義を分割すること
  • 関数の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の形式で記述すること(可読性がよくなるため)
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1