LoginSignup
3
3

More than 3 years have passed since last update.

Golangアプリケーション運用の個人用FAQ

Last updated at Posted at 2019-09-28

Golang運用で最初につまづいた点、採用した方針等をまとめてみました。

最初にやっておけばよかった事
値レシーバとポインタレシーバの違い
ORMは何を使うか
アプリ実装上の考慮点
設定の管理方法
  • godotenvで.envに環境変数情報を持たせる (1ファイルで管理しやすい、コンテナ化する際に何を渡すか明確であるため)
タスクランナーは何を使うか
Dockerコンテナ化したい時はどうするか

MultiStageビルドを行う。
最終的にGoランタイムを含めずに
ビルド済バイナリのみ配布するので実行用コンテナが軽量になる
->コンテナ起動が早くなる

  • Step1: ビルド専用コンテナでビルド処理
    • ビルド専用の使い捨てコンテナ
    • DockerfileでFROMに指定するイメージはGoランタイムを含む軽量イメージにする(golang:1.13-alpine等)
    • ビルド時にCGO_ENABLED=0オプションを付ける。staticLinkでビルドされないため。
    • 本番運用の際はビルド時に「-ldflags '-s -w'」オプションを付ける。
      • sオプションはシンボルテーブル等(デバッグ)が含まれなくなる
      • wオプションはデバッグ情報が含まれなくなる
    • 必要なファイルしか入れない。必要なら.dockerignore使う
  • Step2: 実行コンテナ用コンテナの起動
    • DockerfileでFROMに指定するイメージは、Goランタイム含まない低サイズイメージにする(scratch等)
    • Step1のコンテナからビルド済バイナリだけADD
    • 外部APIコール等のためにTLSリクエスト行う場合はca証明書もADDする
PHPのvar_dump, jsのconsole.log的なものはある?
ログの扱い方
  • logパッケージを使う
  • log.SetPrefix("[TEST]")でログ接頭辞追加ができる
  • log.println, log.Fatalln, log.Panicln, fmt.printlnの違いは何?
文字列長の求め方
通常の関数とレシーバ関数の使い分け
構造体-JSON間の変換はどうするか
例外処理はどう表現するか
時刻、日付の扱い方
  • time.Parseを使う
  • 日付ならAddDate、時間ならAddTimeを使う
  • 日付
    • t := time.Now()
    • 日付
      • t.Date()
      • t.Year()
      • t.Month()
    • 日付
      • t.Day()
    • 日付の増減
      • 1日後
      • t.AddDate(0,0,1)
      • 1日前
      • t.AddDate(0,0,-1)
      • 1ヶ月後
      • t.AddDate(0,1,0)
      • 1ヶ月後
      • t.AddDate(0,-1,0)
  • https://ashitani.jp/golangtips/tips_time.html#time_Parse
APIクライアントの作り方
3
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
3
3