0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Golangでバックエンドを実装する上での注意点

Last updated at Posted at 2020-08-29

備忘録としてまとめる.何かの役に立てたら幸いです.
(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 a context 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)を使っていると遭遇しやすい問題だと思う.

解決策はあるので開発者の意識の問題だと感じた.
参考サイト

0
3
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?