
Goで設定関連の情報はどうやって読み込むのかな?
通常、アプリの設定に関する情報はconfigファイルにまとめてプログラムとは別に管理します。
特に、パスワードなど外部に漏れては行けない情報をプログラムに直接記述するのは、とても危険です。
今回はGoでconfigファイルを読み込むための準備を行い、簡易的にconfigファイルを読み込んでみましょう。¥
今回のソースはGitHubからダウンロードできます。
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.go
で config.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)

あれ?エラーになりましたね。
実は、この段階でテキストエディタ(私の場合は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
は不要な依存パッケージを削除するコマンドなのですが、それだけでなく不足しているパッケージがあれば追加してくれるコマンドです。

ここまでやれば、プログラムも正常に動くでしょう。
先程までエラーで赤かったテキストエディタも、無事にエラーが無くなっています。

// 出力結果
$ 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