m_shige1979のささやかな抵抗と欲望の日々

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(注意すること)

https://github.com/mshige1979

go言語で設定ファイルを読み込み2(別パッケージにして扱う)

1つのファイルの場合

はメンテしづらいので分割する

ファイル構成

.
├── config
│   └── appconfig.go
├── config.json
└── sample2.go

こんな感じ

実装

config.json
{
    "url": "http://hogehoge.com",
    "count": 100,
    "user": "hoge",
    "pass": "foo"
}
config/appconfig.go
package config

import (
    "io/ioutil"
    "encoding/json"
)

// 構造体定義
type Config struct {
    Url   string  `json:"url"`
    Count int     `json:"count"`
    User  string  `json:"user"`
    Pass  string  `json:"pass"`
}

// configファイルを読み込み構造体へ割当
func Read(filename string) (*Config, error) {

    // 構造体を定義
    c := new(Config)

    // 設定ファイルを読み込む
    jsonString, err := ioutil.ReadFile(filename)
    if err != nil {
        // エラー
        return c, err
    }

    // 設定
    err = json.Unmarshal(jsonString, c)
    if err != nil {
        // エラー
        return c, err
    }

    // 正常
    return c, nil
}
sample2.go
package main

import (
    "log"
    "os"
    "strconv"
    "./config"
)

// jsonの設定ファイルを読み込むサンプル
func main() {
    // 処理開始
    log.Println("start")

    // 構造体へconfigの結果を設定
    c, err := config.Read("config.json")
    if err != nil {
        log.Println(err)
        os.Exit(1)
    }

    // 結果出力
    log.Println("url   = " + c.Url)
    log.Println("count = " + strconv.Itoa(c.Count))
    log.Println("user  = " + c.User)
    log.Println("pass  = " + c.Pass)

    // 処理終了
    log.Println("end")
}

所感

うん、まあそれなりにスッキリした感じです。
構造体の場合は値渡しか参照渡しとなるかをきちんと考える必要がある