4.12 آموزش کار با ini

4.12 آموزش کار با ini

بطور خلاصه فایل های ini.* جهت ذخیره تنظیمات مختلف استفاده می شود تنظیماتی مثل: آدرس خاص در شبکه، اطلاعات ورود به سیستم های مختلف و موارد از این قبیل.

برای شروع ساختار پروژه ما به این شکل است

$ mkdir -p /tmp/ini
$ cd /tmp/ini
$ touch my.ini main.go
$ tree . .
├── main.go
└── my.ini

در پروژه دو فایل ایجاد کردیم یکی فایل اصلی برنامه main.go و دیگری my.ini که می خواهیم تنظیمات برنامه را در آن نگهداری کنیم. محتوای داخل فایل ini را بصورت ذیل تعریف کرده ایم

# possible values : production, development
app_mode = development

[paths]
# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
data = /home/git/grafana

[server]
# Protocol (http or https)
protocol = http

# The http port to use
http_port = 9999
# Redirect to correct domain if host header does not match domain # Prevents DNS rebinding attacks
enforce_domain = true

همانطور که در توصیف کد آمده است 5 مقدار مختلف داخل فایل آمده است برخی را توضیح می دهیم

  1. مقدار app_mode که در واقع میخواهیم جهت تشخیص مود توسعه استفاده کنیم برای مثال به کمک این مقدار میخواهیم لاگ های برنامه در پروداکشن نمایش داده نشود ولی در زمان توسعه دهنده بتوانیم لاگ هایم مختلف را مشاهده کنیم.
  2. قسمت بعد protocol است که کاملا مشخص می باشد و در واقع میخواهیم پروتکل استفاده شده را مشخص کنیم
  3. حط بعد شماره پورت مورد استفاده برنامه است که مقدار 9999 می باشد

مقادیر وارد شده صرفا برای مثال می باشد و می توان هر مقداری را که در برنامه نیاز دارید ایجاد کنید.

package main
import (
"fmt"
"os"
"gopkg.in/ini.v1"
)

func main() {
cfg, err := ini.Load("my.ini")

if err != nil {
fmt.Printf("Fail to read file: %v", err)
os.Exit(1)
}

// Classic read of values, default section can be represented as empty string
fmt.Println("App Mode:", cfg.Section("").Key("app_mode").String())
fmt.Println("Data Path:", cfg.Section("paths").Key("data").String())

// Let's do some candidate value limitation
fmt.Println("Server Protocol:",
cfg.Section("server").Key("protocol").In("http", []string{"http", "https"}))

// Value read that is not in candidates will be discarded and fall back to given default value
fmt.Println("Email Protocol:", cfg.Section("server").Key("protocol").In("smtp", []string{"imap", "smtp"}))

// Try out auto-type conversion
fmt.Printf("Port Number: (%[1]T) %[1]d\n", cfg.Section("server").Key("http_port").MustInt(9999))

fmt.Printf("Enforce Domain: (%[1]T) %[1]v\n", cfg.Section("server").Key("enforce_domain").MustBool(false))

// Now, make some changes and save it
cfg.Section("").Key("app_mode").SetValue("production") cfg.SaveTo("my.ini.local")

}

کد بالا به اندازه کافی شفاف و ساده است که نیازی به توضیح بیشتر ندارد در ابتدا نیاز است تا بسته “gopkg.in/ini.v1” را به برنامه اضافه کنیم سپس با متد load فایل کانفیگ موجود را به حافظه بارگذاری می کنیم تا محتوای آن را بخوانیم و خط های بعد مقادیر آن را میخوانیم در خط پایانی نیز مقدار app_mode را به production تغییر دادیم و در فایل جدیدی به نام my.ini.local ذخیره کردیم .

می توانیم به شکل های مختلف یک فایل را بارگذاری یا ایجاد کنیم به مثال ذیل توجه کنید:

cfg, err := ini.Load( []byte("raw data"),  // Raw data
					 "filename",           // File
					 ioutil.NopCloser(bytes.NewReader([]byte("some other data"))),
)

در این قطعه کد ما تنظیمات خود را به 3 شکل می توانیم فراخوانی کنیم رشته، فایل و io.ReadCloser البته در صورت نیاز می توانیم یک فایل خالی در فضای حافظه بشکل ذیل نیز ایجاد کنیم.

cfg := ini.Empty()

در ابتدا می توانید هر تعداد فایل ini را بارگذاری و یا فرخوانی کنید ولیکن مواقعی نیاز دارید که یک منبع دیگر به آنها اضافه کنید که برای این منظور می توانید از دستور Append استفاده نمائید

err := cfg.Append("other file", []byte("other raw data"))

و یا مواقعی از چند منبع اقدام به بارگذاری می نمائید که احتمال دارد برخی از آن منابع خطا در بارگذاری دهد در این شرایط بهتر از تابع   ()LooseLoadd استفاده کنید

cfg, err := ini.LooseLoad("filename", "filename_404")

و در نهایت می توانید پس از تغییرات دلخواه فایل را بصورت ذیل ذخیره نمائید

// ...
err = cfg.SaveTo("my.ini")
err = cfg.SaveToIndent("my.ini", "\t")

همانطور که در بالا دید برای دسترسی به یک قسمت از فایل ما از تابع Section بصورت ذیل استفاده می کنیم

sec, err := cfg.GetSection("section name")

که در اینجا “section name” نام قطعه کد ما در فایل تنظیمات است. برخی از توابع مهم این بسته عبارت اند از : 1.

err := cfg.NewSection("new section")

جهت ایجاد قطعه جدید 2.

secs := cfg.Sections()
names := cfg.SectionStrings()

برای بدست آوردن تمامی قطعات داخل فایل 3.

key, err := cfg.Section("").GetKey("app_mode")

برای بدست آوردن key یک section بطور مثال “app_mode” 4.

key, err := cfg.Section("").HasKey("app_mode")

برای بررسی وجود یک key 5.

key, err := cfg.Section("").NewKey("name", "value")

برای ایجاد یک key جدید