いろいろ備忘録日記

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

Goメモ-372 (INIファイルを操作)(go-ini)

関連記事

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

概要

以下、自分用のメモです。忘れないうちにとりあえずメモメモ。。。

INIファイルを操作する必要があったので

github.com

をつかって、操作してみたメモです。

使いやすいですねー。このライブラリ。

サンプル

READ

package main

import (
    "fmt"

    "gopkg.in/ini.v1"
)

func main() {
    if err := run(); err != nil {
        panic(err)
    }
}

func run() error {
    //
    // iniファイル読み込み
    //
    var (
        cfg *ini.File
        err error
    )

    cfg, err = ini.Load("config.ini")
    if err != nil {
        return err
    }

    //
    // セクション取得
    //
    var (
        secGeneral  *ini.Section
        secDatabase *ini.Section
        secLogging  *ini.Section
    )

    secGeneral = cfg.Section("General")
    secDatabase = cfg.Section("Database")
    secLogging = cfg.Section("Logging")

    //
    // キー取得
    //
    var (
        keyVersion *ini.Key
        keyHost    *ini.Key
        keyLevel   *ini.Key
    )

    keyVersion = secGeneral.Key("Version")
    keyHost = secDatabase.Key("Host")
    keyLevel = secLogging.Key("Level")

    //
    // 値取得
    //   *ini.Keyにいろいろな型で値を取得するメソッドが用意されている
    //
    fmt.Printf("Version=%s\n", keyVersion.String())
    fmt.Printf("Host=%s\n", keyHost.MustString("unknown"))
    fmt.Printf("Level=%s (%s)\n", keyLevel.Value(), keyLevel.Comment)

    return nil

    /*
      $ task
      task: [default] go run main.go
      Version=1.0.0
      Host=localhost
      Level=DEBUG (; ログレベル)
   */
}

https://github.com/devlights/try-golang/tree/main/examples/singleapp/ini_file/read

WRITE

package main

import "gopkg.in/ini.v1"

func main() {
    if err := run(); err != nil {
        panic(err)
    }
}

func run() error {
    //
    // 空のiniファイルを用意
    //
    cfg := ini.Empty()

    //
    // セクションの追加
    //
    var (
        secGeneral  *ini.Section
        secDatabase *ini.Section
        secLogger   *ini.Section
    )

    secGeneral = cfg.Section("General")
    secDatabase = cfg.Section("Database")
    secLogger = cfg.Section("Logging")

    //
    // キーと値の追加
    //
    secGeneral.NewKey("AppName", "MyApplication")
    secGeneral.NewKey("Version", "1.0.0")
    secGeneral.NewKey("License", "MIT")

    secDatabase.NewKey("Host", "localhost")
    secDatabase.NewKey("User", "root")
    secDatabase.NewKey("Password", "")
    secDatabase.NewKey("DatabaseName", "my_database")

    secLogger.NewKey("Level", "DEBUG")
    key, _ := secLogger.NewKey("LogFile", "/var/log/myapp.log")
    key.Comment = "ログファイル"

    //
    // 書き出し
    //
    if err := cfg.SaveTo("config.ini"); err != nil {
        return err
    }

    return nil

    /*
      $ task
      task: [default] go run main.go
      task: [default] cat config.ini
      [General]
      AppName = MyApplication
      Version = 1.0.0
      License = MIT

      [Database]
      Host         = localhost
      User         = root
      Password     =
      DatabaseName = my_database

      [Logging]
      Level   = DEBUG
      ; ログファイル
      LogFile = /var/log/myapp.log
   */
}

https://github.com/devlights/try-golang/tree/main/examples/singleapp/ini_file/write

APPEND

package main

import "gopkg.in/ini.v1"

func main() {
    if err := run(); err != nil {
        panic(err)
    }
}

func run() error {
    //
    // iniファイル読み込み
    //
    var (
        cfg *ini.File
        err error
    )

    cfg, err = ini.Load("config.ini")
    if err != nil {
        return err
    }

    //
    // 既存のキーの値を変更
    //
    cfg.Section("Database").Key("User").SetValue("gitpod")

    //
    // 新しいセクションとキーの追加
    //
    newSection := cfg.Section("NewSection")
    newSection.Key("NewKey").SetValue("NewValue")

    //
    // 書き出し
    //
    if err := cfg.SaveTo("config-updated.ini"); err != nil {
        return err
    }

    return nil

    /*
      $ task
      task: [default] go run main.go
      task: [default] diff -u config.ini config-updated.ini
      --- config.ini  2024-01-17 05:18:00.670661597 +0000
      +++ config-updated.ini  2024-01-17 05:19:09.686594430 +0000
      @@ -5,7 +5,7 @@

       [Database]
       Host         = localhost
      -User         = root
      +User         = gitpod
       Password     =
       DatabaseName = my_database

      @@ -14,3 +14,6 @@
       Level   = DEBUG
       ; ログファイル
       LogFile = /var/log/myapp.log
      +
      +[NewSection]
      +NewKey = NewValue
   */

}

https://github.com/devlights/try-golang/tree/main/examples/singleapp/ini_file/append

参考情報

github.com

Goのおすすめ書籍

上の書籍の日本語版が下です。


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

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