いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-433 (envメモ)(03.all-fields-required)

関連記事

devlights.hatenablog.com

devlights.hatenablog.com

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

前回に引き続き、github.com/caarlos0/env のメモです。

今回は、一括で全フィールドを必須項目としてマークする方法について。

サンプル

package main

import (
    "github.com/caarlos0/env/v11"
    "github.com/k0kubun/pp/v3"
)

type (
    // Config は、環境変数の値を保持する構造体です.
    //
    // # REFERENCES
    //   - https://github.com/caarlos0/env
    Config struct {
        HomeDir string `env:"HOME"`
        MyEnv1  string `env:"MYENV1"`
        MyEnv2  int    `env:"MYENV2"`
    }
)

func main() {
    if err := run(); err != nil {
        pp.Fatal(err)
    }
}

func run() error {
    var (
        cfg  Config
        opts = env.Options{
            RequiredIfNoDef: true, // 全項目を必須扱い
        }
        err error
    )

    // 環境変数の値を取得して値を構造体に設定してもらう
    // オプションも渡す場合は env.Parse() ではなく env.ParseWithOptions() を利用する
    err = env.ParseWithOptions(&cfg, opts)
    if err != nil {
        pp.Println(err)
    }

    // Pretty Print
    pp.Println(cfg)

    return nil
}

オプションにて、RequiredIfNoDef を true に設定することにより、デフォルトで構造体の全公開フィールドが必須項目となります。

実行すると以下のようになります。

# https://taskfile.dev

version: '3'

vars:
  APP_NAME: app

tasks:
  default:
    cmds:
      - task: run
  build:
    cmds:
      - go build -o {{.APP_NAME}}
  run:
    deps: [ build ]
    cmds:
      - ./{{.APP_NAME}}
    env:
      MYENV1: helloworld
      #MYENV2: 999
  clean:
    cmds:
      - rm -f ./{{.APP_NAME}}
$ task
task: [build] go build -o app
task: [run] ./app
env.AggregateError{
  Errors: []error{
    env.EnvVarIsNotSetError{
      Key: "MYENV2",
    },
  },
}
main.Config{
  HomeDir: "/home/gitpod",
  MyEnv1:  "helloworld",
  MyEnv2:  0,
}

構造体タグの方で required を付与していないけど、ちゃんとエラーとなっていますね。

サンプルは以下にアップしてあります。

try-golang-extlib/examples/singleapp/env/03.all-fields-required at main · devlights/try-golang-extlib · GitHub

参考情報

carlosbecker.com

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。