備忘録としてまとめる.何かの役に立てたら幸いです.
(2020/08/30更新:typeについて)
Golang
nilの意味
nullのこと.
SQLパッケージの場合は第二戻り値がerrかどうか返ってくるのでそれを使ってエラーハンドリングをする
参考サイト
変数の定義
定義には明示的な定義(var)と暗黙的な定義(:=)が存在
httpパッケージについて
http.HandlerFunc
関数の構造体. -> func(ResponseWriter, *Request)
の別名
(type
の意味を正しく理解していませんでした.)
この定義によりhandlerの構造体を定義することなく関数を用意するだけでhandlerを書くことができる
type HandlerFunc func(ResponseWriter, *Request)
typeについて
type
をつけることで別名をつけることができる.これは既存の型や型リテラル(構造体,配列,ポインタ,関数,interfaceなど)が対象.type
をつける利点の一つとしてメソッドの定義がある
typeと構造体について
for文について
golangではfor文で繰り返しの処理のすべてを実現
参考サイト
エラーハンドリングについて
golangのエラー型error
はinterface型なので独自のエラー型を定義するのが簡単.
type error interface {
Error() string
}
参考サイト
ただ,エラーの扱いについては様々な案がある.(後日追記予定)
contextについて
In Go servers, each incoming request is handled in its own goroutine. Request handlers often start additional goroutines to access backends such as databases and RPC services. The set of goroutines working on a request typically needs access to request-specific values such as the identity of the end user, authorization tokens, and the request's deadline. When a request is canceled or times out, all the goroutines working on that request should exit quickly so the system can reclaim any resources they are using.
At Google, we developed acontext
package that makes it easy to pass request-scoped values, cancelation signals, and deadlines across API boundaries to all the goroutines involved in handling a request.
私の解釈では,contextとはユーザ識別子, token, リクエスト期限などの情報をひとまとめにしたもの.これを使うことで様々なAPIを横断する際に処理が楽になると理解した.
参考サイト
logとfmtの違い
違いは,
- 表示形式(以下参考)
- 扱い
- log: stderr
- fmt: stdout
実行コード
func main() {
fmt.Println("Hello fmt")
log.Println("Hello log")
}
出力
Hello fmt ← fmtパッケージ
2017/05/01 09:00:34 Hello log ← logパッケージ
goimportsの設定方法
通常golangではpackageのimport順序として以下のように記入する
これを自動で整形してくれるのがgoimports
また有名なエディタでは事前に設定すると自動フォーマットしてくれる.
import(
// 標準package
// github.comとか有名なpackage
// 独自package
)
mapの扱い
web frameworkについて
sliceの戻り値について
sliceは参照型なので戻り値を工夫することができる
参考サイト
intの扱いについて
実行環境に依存しないように指定した方が安心
参考サイト
命名規則について
注意すべき点として,構造体のfiled名
- 頭文字小文字は同package内でのみ参照可能
- 頭文字大文字は同package外でも参照可能
DB
操作について
N+1問題
一覧に表示するデータを取得するために SELECT を 1 回実行(N レコード返される)
→
各データの関連データを取得するために SELECT を N 回実行
→
結果,データベースアクセス(SELECT)が合計 N+1 回も実行される
O/Rマッパー(ORM)(SQL文を書かずにDB操作ができる仕組み ex. sqlalchemy)を使っていると遭遇しやすい問題だと思う.
→
解決策はあるので開発者の意識の問題だと感じた.
参考サイト