这里的教程很详细
https://github.com/go-ini/ini/blob/master/README_ZH.md
下面总结下经典的用法
使用
go get github.com/go-ini/ini
功能特性
支持覆盖加载多个数据源([]byte、文件和 io.ReadCloser) 支持递归读取键值 支持读取父子分区 支持读取自增键名 支持读取多行的键值 支持大量辅助方法 支持在读取时直接转换为 Go 语言类型 支持读取和 写入 分区和键的注释 轻松操作分区、键值和注释 在保存文件时分区和键值会保持原有的顺序
忽略键名的大小写
有时候分区和键的名称大小写混合非常烦人,这个时候就可以通过 InsensitiveLoad 将所有分区和键名在读取里强制转换为小写:
cfg, err := ini.InsensitiveLoad("filename") //... // sec1 指向一个分区对象 sec1, err := cfg.GetSection("Section") // key1 指向一个键对象 key1, err := sec1.GetKey("Key")
关于注释
下述几种情况的内容将被视为注释:
所有以 # 或 ; 开头的行
所有在 # 或 ; 之后的内容
分区标签后的文字 (即 [分区名] 之后的内容)
如果你希望使用包含 # 或 ; 的值,请使用 ` 或 """ 进行包覆。
操作分区(Section)
获取指定分区: section, err := cfg.GetSection("section name") 如果您想要获取默认分区,则可以用空字符串代替分区名: section, err := cfg.GetSection("") 当您非常确定某个分区是存在的,可以使用以下简便方法: section := cfg.Section("section name")
操作键(Key)
获取某个分区下的键: key, err := cfg.Section("").GetKey("key name") 和分区一样,您也可以直接获取键而忽略错误处理: key := cfg.Section("").Key("key name") 判断某个键是否存在: yes := cfg.Section("").HasKey("key name") 操作键值(Value) 获取一个类型为字符串(string)的值: val := cfg.Section("").Key("key name").String() 如果您不需要任何对值的自动转变功能(例如递归读取),可以直接获取原值(这种方式性能最佳): val := cfg.Section("").Key("key name").Value()
获取其它类型的值:
// 布尔值的规则: // true 当值为:1, t, T, TRUE, true, True, YES, yes, Yes, y, ON, on, On // false 当值为:0, f, F, FALSE, false, False, NO, no, No, n, OFF, off, Off v, err = cfg.Section("").Key("BOOL").Bool() v, err = cfg.Section("").Key("FLOAT64").Float64() v, err = cfg.Section("").Key("INT").Int() v, err = cfg.Section("").Key("INT64").Int64() v, err = cfg.Section("").Key("UINT").Uint() v, err = cfg.Section("").Key("UINT64").Uint64() v, err = cfg.Section("").Key("TIME").TimeFormat(time.RFC3339) v, err = cfg.Section("").Key("TIME").Time() // RFC3339 v = cfg.Section("").Key("BOOL").MustBool() v = cfg.Section("").Key("FLOAT64").MustFloat64() v = cfg.Section("").Key("INT").MustInt() v = cfg.Section("").Key("INT64").MustInt64() v = cfg.Section("").Key("UINT").MustUint() v = cfg.Section("").Key("UINT64").MustUint64() v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339) v = cfg.Section("").Key("TIME").MustTime() // RFC3339 // 由 Must 开头的方法名允许接收一个相同类型的参数来作为默认值, // 当键不存在或者转换失败时,则会直接返回该默认值。 // 但是,MustString 方法必须传递一个默认值。 v = cfg.Seciont("").Key("String").MustString("default") v = cfg.Section("").Key("BOOL").MustBool(true) v = cfg.Section("").Key("FLOAT64").MustFloat64(1.25) v = cfg.Section("").Key("INT").MustInt(10) v = cfg.Section("").Key("INT64").MustInt64(99) v = cfg.Section("").Key("UINT").MustUint(3) v = cfg.Section("").Key("UINT64").MustUint64(6) v = cfg.Section("").Key("TIME").MustTimeFormat(time.RFC3339, time.Now()) v = cfg.Section("").Key("TIME").MustTime(time.Now()) // RFC3339
要是我属于一行的内容写不下想要写到第二行怎么办?
[advance] two_lines = how about \ continuation lines? lots_of_lines = 1 \ 2 \ 3 \ 4 简直是小菜一碟! cfg.Section("advance").Key("two_lines").String() // how about continuation lines? cfg.Section("advance").Key("lots_of_lines").String() // 1 2 3 4
需要注意的是,值两侧的单引号会被自动剔除:
foo = "some value" // foo: some value bar = 'some value' // bar: some value
操作键值的辅助方法
获取键值时设定候选值:
v = cfg.Section("").Key("STRING").In("default", []string{"str", "arr", "types"}) v = cfg.Section("").Key("FLOAT64").InFloat64(1.1, []float64{1.25, 2.5, 3.75}) v = cfg.Section("").Key("INT").InInt(5, []int{10, 20, 30}) v = cfg.Section("").Key("INT64").InInt64(10, []int64{10, 20, 30}) v = cfg.Section("").Key("UINT").InUint(4, []int{3, 6, 9}) v = cfg.Section("").Key("UINT64").InUint64(8, []int64{3, 6, 9}) v = cfg.Section("").Key("TIME").InTimeFormat(time.RFC3339, time.Now(), []time.Time{time1, time2, time3}) v = cfg.Section("").Key("TIME").InTime(time.Now(), []time.Time{time1, time2, time3}) // RFC3339 如果获取到的值不是候选值的任意一个,则会返回默认值,而默认值不需要是候选值中的一员。
验证获取的值是否在指定范围内:
vals = cfg.Section("").Key("FLOAT64").RangeFloat64(0.0, 1.1, 2.2) vals = cfg.Section("").Key("INT").RangeInt(0, 10, 20) vals = cfg.Section("").Key("INT64").RangeInt64(0, 10, 20) vals = cfg.Section("").Key("UINT").RangeUint(0, 3, 9) vals = cfg.Section("").Key("UINT64").RangeUint64(0, 3, 9) vals = cfg.Section("").Key("TIME").RangeTimeFormat(time.RFC3339, time.Now(), minTime, maxTime) vals = cfg.Section("").Key("TIME").RangeTime(time.Now(), minTime, maxTime) // RFC3339
–
–
–
评论前必须登录!
注册