go-iniを導入してconfigファイルをGoプログラムで読み込む

Go言語
この記事は約7分で読めます。
Go初学者
Go初学者

Goで設定関連の情報はどうやって読み込むのかな?

この記事ではGoでconfigファイルを読み込む方法を理解できます!
  • go-iniをインストールする
  • configファイルを読み込んでみる
  • go-iniでconfigファイルを読み込む注意点

通常、アプリの設定に関する情報はconfigファイルにまとめてプログラムとは別に管理します。

特に、パスワードなど外部に漏れては行けない情報をプログラムに直接記述するのは、とても危険です。

今回はGoでconfigファイルを読み込むための準備を行い、簡易的にconfigファイルを読み込んでみましょう。¥

今回のソースはGitHubからダウンロードできます。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

go-iniを導入しよう

設定情報は xxxxx.ini という形でファイル管理します。

もりぴ
もりぴ

今回はconfigファイルなので、config.ini で進めていきます。

Go言語でiniファイルを読み込むには、サードパーティ製の go-ini をインストールする必要があります。

インストール自体は簡単で、以下のコマンドをターミナルから実行すればOKです。

$ go get "gopkg.in/go-ini/ini.v1"
go: downloading gopkg.in/go-ini/ini.v1 v1.62.0

これで終了です。

ただ、これだけだと実際に使用する際に注意する点もあるので、簡単なプログラムで確認していきましょう。

configファイルを読み込んでみる

それでは、configファイルを読み込む簡単なプログラムで動きを確認しましょう。

プログラムの構成は下記の通りです。

morip@morip-PC1:~/go/src/ini_test$ tree
.
├── config // 設定用のフォルダ
│   └── config.go // 設定関連のGoプログラム
├── config.ini  // 設定情報のiniファイル
└── main.go

まずは config.ini の中を確認しましょう。

// config.ini

[web]
port = 8080  // ポート番号
logfile = webapp2.log  // logファイル

[db]
driver = sqlite3  // 使用するデータベース
name = webapp2.sql  // 使用するデータベース名

iniファイルの記述方法は一般的に上記のようになります。

次に config.go の中を確認します。

もりぴ
もりぴ

コードの内容はコメントで確認してください。

// config.go

// パッケージの宣言
package config

import (
    "log"

    "gopkg.in/go-ini/ini.v1"
)

// iniファイルの内容を構造体でまとめる
type ConfigList struct {
    Port      int
    SQLDriver string
    DBName    string
    LogFile   string
}


// ConfigList(構造体)を外部パッケージからも読み込めるようにパブリックで変数宣言
var Config ConfigList

// init()でmain関数より先に実行
func init()  {
    LoadConfig()
}

func LoadConfig() {
    // iniファイルを読み込む
    cfg, err := ini.Load("config.ini")
    if err != nil {
	log.Fatalln(err)
    }
    // 構造体を初期化する
    Config = ConfigList{
        // iniファイルのデータを読み込む
	Port:      cfg.Section("web").Key("port").MustInt(8080),
	SQLDriver: cfg.Section("db").Key("driver").String(),
	DBName:    cfg.Section("db").Key("name").String(),
	LogFile:   cfg.Section("web").Key("logfile").String(),
    }
}

MustInt(8080) は、もし config.ini にPortのデータが無くても 8080 を代入するというものです。

他の String() は、config.ini にデータが無くてもstring型の初期値の空文字が代入されます。

次に main.goconfig.ini のデータを出力します。

// main.go

package main

import (
    "fmt"
    "ini_test/config"
)

func main()  {
    fmt.Println(config.Config.Port)
    fmt.Println(config.Config.SQLDriver)
    fmt.Println(config.Config.DBName)
    fmt.Println(config.Config.LogFile)
}

では、実行してみましょう。

// 出力結果
$ go run main.go
main.go:5:2: package todo_app/config is not in GOROOT (/usr/lib/go-1.16/src/todo_app/config)
Go初学者
Go初学者

あれ?エラーになりましたね。

実は、この段階でテキストエディタ(私の場合はVSCode)ではエラーが出ています。

VSCodeのエラー状態
もりぴ
もりぴ

では、このエラーを回避していきましょう!

go-iniでconfigファイルを読み込む注意点

configファイルの読み込みだけでなく、go 1.13 からは go mod でモジュール管理が推奨されています。

go mod init とターミナルで入力し実行します。

// 出力結果
$ go mod init
go: creating new go.mod: module ini_test
go: to add module requirements and sums:
        go mod tidy
もりぴ
もりぴ

出力結果通りに go mod tidy をターミナルで実行します。

// 出力結果
$ go mod tidy
go: finding module for package gopkg.in/go-ini/ini.v1
go: found gopkg.in/go-ini/ini.v1 in gopkg.in/go-ini/ini.v1 v1.62.0
go: finding module for package gopkg.in/ini.v1
go: finding module for package github.com/smartystreets/goconvey/convey
go: found github.com/smartystreets/goconvey/convey in github.com/smartystreets/goconvey v1.6.4
go: found gopkg.in/ini.v1 in gopkg.in/ini.v1 v1.62.0

go mod tidy は不要な依存パッケージを削除するコマンドなのですが、それだけでなく不足しているパッケージがあれば追加してくれるコマンドです。

もりぴ
もりぴ

ここまでやれば、プログラムも正常に動くでしょう。

先程までエラーで赤かったテキストエディタも、無事にエラーが無くなっています。

VSCodeのエラーが無くなった
// 出力結果
$ go run main.go
8080
sqlite3
webapp2.sql
webapp2.log

config.ini の内容がGoのプログラムに読み込むことができました。

// 出力結果
$ go run main.go
main.go:5:2: package todo_app/config is not in GOROOT (/usr/lib/go-1.16/src/todo_app/config)

上記のエラーメッセージが出たら、go mod init go mod tidy のコマンドを実行しましょう。

下記のような構成になればOKです。

morip@morip-PC1:~/go/src/ini_test$ tree
.
├── config
│   └── config.go
├── config.ini
├── go.mod  // go mod init実行で作成される
├── go.sum  // go mod tidy実行で作成される
└── main.go

【最後に】Goでアプリ開発するには前準備をしておこう!

今回は、Go言語でアプリ開発するための前準備として go-ini のインストールと簡単なプログラムで動きを確認してきました。

iniファイルは、特にWEBアプリ開発では不可欠なファイルですので go-ini は忘れずにインストールしておきましょう。

comment

タイトルとURLをコピーしました