Help us understand the problem. What is going on with this article?

viperでファイルを読み込んで構造体にマッピングする

More than 1 year has passed since last update.

はじめに

viperを使ってconfファイルを読もうとして、無駄に2時間程度はまってしまった。
同じような人もいると思うので、この記事に簡単に残しておく。

ソースコード

やりたい事は、config.ymlを読み込ませて、構造体にマッピングする。

//conf.go
type config struct {
    /*
        yml形式に合わせて構造体で記述する。
        先頭の文字が大文字でないとUnmarshalで読み込めない
        https://qiita.com/hachi8833/items/fe3d5d6b1285c5ef1821
        バグであるのかも
    */
    Database struct {
        Host     string
        Port     string
        User     string
        Password string
    }
}

func Configure() {
    // 外部からconfの中身を参照できるようにする
    var C config

    // 設定ファイル名を記載
    viper.SetConfigName("config")

    // ファイルタイプ
    viper.SetConfigType("yml")

    // ファイルパスの設定。クロスプラットフォームで参照できるようにfilepathライブラリを使用
    viper.AddConfigPath(filepath.Join("$GOPATH", "src", "github.com", "yoshinorihisakawa", "sample-api-hoop", "conf"))

    // 環境変数から設定値を上書きできるように設定
    viper.AutomaticEnv()

    // conf読み取り
    if err := viper.ReadInConfig(); err != nil {
        fmt.Println("config file read error")
        fmt.Println(err)
        os.Exit(1)
    }

    // UnmarshalしてCにマッピング
    if err := viper.Unmarshal(&C); err != nil {
        fmt.Println("config file Unmarshal error")
        fmt.Println(err)
        os.Exit(1)
    }
}
// config.yml
database:
    host: "127.0.0.1"
    port: "3306"
    user: "postgres"
    password: "yoshi0923"

ハマったポイント

・SetConfigNameでなくSetConfigFileとしてしまっていた。
 SetConfigFileを使う場合は、ファイルのパス全て参照させる必要がある。
 ライブラリの中を追いまくっておかしいと思い、docを見て気づいた。

・構造体の先頭文字を大文字にしなければUnmarshalしてくれない。
 ソースおってもよくわからなかった。
 ただこれは注意事項として覚えておいた方がよさそう。ネットでググって解決した。

yoshinori_hisakawa
Go言語/クリーンアーキテクチャ/DDD/Docker/OOP/Angular/Java/設計/ Fringe81に興味ある方は、メールください! yoshinori_hisakawa@fringe81.com
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