Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Golangガイドライン 1.10系

More than 1 year has passed since last update.

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の形式で記述すること(可読性がよくなるため)
bushiyama
営業からフロントバック、インフラ(ハード・ソフト)まで一通りの器用貧乏さん。 最近はGolang推し。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away