SkillAgentSearch skills...

Ini

📝 Go INI config management. support multi file load, data override merge. parse ENV variable, parse variable reference. Dotenv file parse and loader. INI配置读取管理,支持多文件加载,数据覆盖合并, 解析ENV变量, 解析变量引用。DotEnv 解析加载

Install / Use

/learn @gookit/Ini

README

INI

GitHub go.mod Go version GitHub tag (latest SemVer) Coverage Status Go Report Card Unit-Tests Go Reference

INI contents parser by Golang, INI config data management.

中文说明

Features

  • Easy to use(get: Int Int64 Bool String StringMap ..., set: Set)
  • Support multi file, data load
  • Support for decode data to struct
  • Support for encode data to INI content
    • Comments, environment variables, etc. are reverted
  • Support data override merge
  • Support parse ENV variable
  • Support comments start with ; #, multi line comments /* .. */
  • Support multi line value with """ or '''
  • Complete unit test(coverage > 90%)
  • Support variable reference, default compatible with Python's configParser format %(VAR)s

Parser

Package parser is a Parser for parse INI format content to golang data

Dotenv

Package dotenv that supports importing ENV data from files (eg .env)

  • filename support simple glob pattern. eg: .env.*, *.env

More formats

If you want more support for file content formats, recommended use gookit/config

  • gookit/config - Support multi formats: JSON(default), INI, YAML, TOML, HCL

GoDoc

Install

go get github.com/gookit/ini/v2

Usage

  • example data(testdata/test.ini):
# comments
name = inhere
age = 50
debug = true
hasQuota1 = 'this is val'
hasQuota2 = "this is val1"
can2arr = val0,val1,val2
shell = ${SHELL}
noEnv = ${NotExist|defValue}
nkey = val in default section

; comments
[sec1]
key = val0
some = value
stuff = things
varRef = %(nkey)s

Load data

package main

import (
	"github.com/gookit/ini/v2"
)

// go run ./examples/demo.go
func main() {
	// config, err := ini.LoadFiles("testdata/tesdt.ini")
	// LoadExists will ignore not exists file
	err := ini.LoadExists("testdata/test.ini", "not-exist.ini")
	if err != nil {
		panic(err)
	}

	// load more, will override prev data by key
	err = ini.LoadStrings(`
age = 100
[sec1]
newK = newVal
some = change val
`)
	// fmt.Printf("%v\n", config.Data())
}

Read data

  • Get integer
age := ini.Int("age")
fmt.Print(age) // 100
  • Get bool
val := ini.Bool("debug")
fmt.Print(val) // true
  • Get string
name := ini.String("name")
fmt.Print(name) // inhere
  • Get section data(string map)
val := ini.StringMap("sec1")
fmt.Println(val) 
// map[string]string{"key":"val0", "some":"change val", "stuff":"things", "newK":"newVal"}
  • Value is ENV var
value := ini.String("shell")
fmt.Printf("%q", value)  // "/bin/zsh"
  • Get value by key path
value := ini.String("sec1.key")
fmt.Print(value) // val0
  • Use var refer
value := ini.String("sec1.varRef")
fmt.Printf("%q", value) // "val in default section"
  • Set new value
// set value
ini.Set("name", "new name")
name = ini.String("name")
fmt.Printf("%q", name) // "new name"

Mapping data to struct

type User struct {
	Name string
	Age int
}

user := &User{}
ini.MapStruct(ini.DefSection(), user)

dump.P(user)

Special, mapping all data:

ini.MapStruct("", ptr)

Variable reference resolution

[portal] 
url = http://%(host)s:%(port)s/api
host = localhost 
port = 8080

If variable resolution is enabled,will parse %(host)s and replace it:

cfg := ini.New()
// enable ParseVar
cfg.WithOptions(ini.ParseVar)

fmt.Print(cfg.MustString("portal.url"))
// OUT: 
// http://localhost:8080/api 

Available options

type Options struct {
	// set to read-only mode. default False
	Readonly bool
	// parse ENV var name. default True
	ParseEnv bool
	// parse variable reference "%(varName)s". default False
	ParseVar bool

	// var left open char. default "%("
	VarOpen string
	// var right close char. default ")s"
	VarClose string

	// ignore key name case. default False
	IgnoreCase bool
	// default section name. default "__default"
	DefSection string
	// sep char for split key path. default ".", use like "section.subKey"
	SectionSep string
}

Setting options for default instance:

ini.WithOptions(ini.ParseEnv,ini.ParseVar)

Setting options with new instance:

cfg := ini.New()
cfg.WithOptions(ini.ParseEnv, ini.ParseVar, func (opts *Options) {
	opts.SectionSep = ":"
	opts.DefSection = "default"
})

Dotenv

Package dotenv that supports importing data from files (eg .env) to ENV

NOTE: filename support simple glob pattern. eg: ".env.", ".env"

Usage

err := dotenv.Load("./", ".env")
// err := dotenv.LoadExists("./", ".env")

val := dotenv.Get("ENV_KEY")
// Or use 
// val := os.Getenv("ENV_KEY")

// get int value
intVal := dotenv.Int("LOG_LEVEL")

// with default value
val := dotenv.Get("ENV_KEY", "default value")

Tests

  • go tests with cover
go test ./... -cover
  • run lint by GoLint
golint ./...

Gookit packages

  • gookit/ini Go config management, use INI files
  • gookit/rux Simple and fast request router for golang HTTP
  • gookit/gcli Build CLI application, tool library, running CLI commands
  • gookit/slog Lightweight, easy to extend, configurable logging library written in Go
  • gookit/color A command-line color library with true color support, universal API methods and Windows support
  • gookit/event Lightweight event manager and dispatcher implements by Go
  • gookit/cache Generic cache use and cache manager for golang. support File, Memory, Redis, Memcached.
  • gookit/config Go config management. support JSON, YAML, TOML, INI, HCL, ENV and Flags
  • gookit/filter Provide filtering, sanitizing, and conversion of golang data
  • gookit/validate Use for data validation and filtering. support Map, Struct, Form data
  • gookit/goutil Some utils for the Go: string, array/slice, map, format, cli, env, filesystem, test and more
  • More, please see https://github.com/gookit

Related

License

MIT

View on GitHub
GitHub Stars87
CategoryCustomer
Updated21d ago
Forks16

Languages

Go

Security Score

100/100

Audited on Mar 13, 2026

No findings