スクリプトのお勉強

go 1.16 でviperを使って設定ファイルを読みだすプログラムを作ってみた

投稿日:

他にたくさんあるけど

こんな感じの内容はたくさんあると思いますが、、goの初心者がなんとなく
goの手習いとして、まずは設定ファイルを読みだすことをしてみようと思いました。

go動作環境

  • windows 10 Home
  • Visual Studio Code
  • go 1.16

goを何も設定されてないところから

以下の感じで出来るようにしました。

  • https://golang.org/doc/install
    からダウンロードしてインストール
    インストールディレクトリはデフォルトのまま
  • 以下でgo/src/samplepにmain.goとconfig.ymlを格納する
$ cd %HOMEPATH%/go/src
$ mkdir samplep
$ go mod init
$ go get github.com/spf13/viper
$ go run ./main.go

main.go

main.goは以下の通りです。

package main

import (
    "flag"
    "fmt"

    "github.com/spf13/viper"
)

func main() {
    var (
        c = flag.String("config", "config.yml", "config file")
    )
    flag.Parse()
    var yamlconfig = loadConfigForYaml(*c)
    fmt.Println(yamlconfig.Node)
}

type appConfig struct {
    Node []struct {
        Name string
        URL  string
    }
}

func loadConfigForYaml(configFile string) *appConfig {
    v := viper.New()
    v.SetConfigType("yaml")
    v.SetConfigName(configFile)
    v.AddConfigPath(".")

    if err := v.ReadInConfig(); err != nil {
        fmt.Println("config read error !!!")
        fmt.Println(err)
    }
    conf := &appConfig{}
    if err := v.Unmarshal(conf); err != nil {
        fmt.Println("config file Unmarshal error")
        fmt.Println(err)
    }
    return conf
}

go言語を眺めるだけでなく、久しぶりに書いてみたのですが、まだ文法がよく分かってません。。

単なる感想ですが、Pythonに慣れてると、いまいち融通が効かず、使いづらいです。。

config.yml

読みだす内容は以下の通りです。

---
node:
  - name: 'local-ubuntu'
    url: 'http://192.168.132.128:9100'
  - name: 'VPS'
    url: 'http://192.168.208.111:9100'

実行結果

実行結果は以下になります。

> go run .\main.go
[{local-ubuntu http://192.168.132.128:9100} {VPS http://192.168.208.111:9100}
> go build ./main.go
-a----        2021/02/21     18:21        5856768 main.exe

終わりに

もちろんこれはgoのコンパイルができるか確かめただけです。それでも結構かかりました。。

この次は、Windows GUIプログラミングをしようと思います。

-スクリプトのお勉強

執筆者:

関連記事

Python(prophet)で体重予測

最近ダイエットしていて、少しだけ成果が出たので、グラフ表示しようと思ってました。そのついでにこれからの予測もしてみようということで、過去のデータを集め、グラフ表示してみます。 google Colab …

神奈川県横浜市神奈川区のワクチン接種地図作った

作ってみた。東白楽駅を真ん中にしてみました。なんとなく真ん中な感じなので。 データ元 以下のテキストデータからゴニョゴニョしてます。 https://www.city.yokohama.lg.jp/k …

Python3でMongoDBを使ってみる(MongoEngine)

仕事している過程で、ふと疑問に思うことがありました。非同期についてです。 非同期問題を解決する方法はたくさんあると思いますが、MongoDBで解決できるのかが気になったので試してみました。 非同期問題 …

VMware player(workstation) から WSL2に乗り換える

いままで、VMware player(今のVMWare Workstation Player)上で、作って確認していたけど、いちいち起動するのがだるいです。 ついでにやたらとリソースを使用するので、こ …

Python3/ある日付から日付までの月/日/時間ごとの時刻を算出する

小ネタです。 要するに、時刻A と 時刻B を指定したときの、各時間間隔での時刻取得したかったです。 当初はdateutilを使う方法でなく、自前で実装しようと思ったのですが、面倒なことに気づきました …

google オプトアウト Click here to opt-out.