映射到结构

想要使用更加面向对象的方式玩转 INI 吗?好主意。

  1. Name = Unknwon
  2. age = 21
  3. Male = true
  4. Born = 1993-01-01T20:17:05Z
  5. [Note]
  6. Content = Hi is a good man!
  7. Cities = HangZhou, Boston
  1. type Note struct {
  2. Content string
  3. Cities []string
  4. }
  5. type Person struct {
  6. Name string
  7. Age int `ini:"age"`
  8. Male bool
  9. Born time.Time
  10. Note
  11. Created time.Time `ini:"-"`
  12. }
  13. func main() {
  14. cfg, err := ini.Load("path/to/ini")
  15. // ...
  16. p := new(Person)
  17. err = cfg.MapTo(p)
  18. // ...
  19. // 一切竟可以如此的简单。
  20. err = ini.MapTo(p, "path/to/ini")
  21. // ...
  22. // 嗯哼?只需要映射一个分区吗?
  23. n := new(Note)
  24. err = cfg.Section("Note").MapTo(n)
  25. // ...
  26. }

结构的字段怎么设置默认值呢?很简单,只要在映射之前对指定字段进行赋值就可以了。如果键未找到或者类型错误,该值不会发生改变。

  1. // ...
  2. p := &Person{
  3. Name: "Joe",
  4. }
  5. // ...

这样玩 INI 真的好酷啊!然而,如果不能还给我原来的配置文件,有什么卵用?

从结构反射

可是,我有说不能吗?

  1. type Embeded struct {
  2. Dates []time.Time `delim:"|" comment:"Time data"`
  3. Places []string `ini:"places,omitempty"`
  4. None []int `ini:",omitempty"`
  5. }
  6. type Author struct {
  7. Name string `ini:"NAME"`
  8. Male bool
  9. Age int `comment:"Author's age"`
  10. GPA float64
  11. NeverMind string `ini:"-"`
  12. *Embeded `comment:"Embeded section"`
  13. }
  14. func main() {
  15. a := &Author{"Unknwon", true, 21, 2.8, "",
  16. &Embeded{
  17. []time.Time{time.Now(), time.Now()},
  18. []string{"HangZhou", "Boston"},
  19. []int{},
  20. }}
  21. cfg := ini.Empty()
  22. err = ini.ReflectFrom(cfg, a)
  23. // ...
  24. }

瞧瞧,奇迹发生了。

  1. NAME = Unknwon
  2. Male = true
  3. ; Author's age
  4. Age = 21
  5. GPA = 2.8
  6. ; Embeded section
  7. [Embeded]
  8. ; Time data
  9. Dates = 2015-08-07T22:14:22+08:00|2015-08-07T22:14:22+08:00
  10. places = HangZhou,Boston

配合 ShadowLoad 进行映射

如果您希望配合 ShadowLoad 将某个分区映射到结构体,则需要指定 allowshadow 标签。

假设您有以下配置文件:

  1. [IP]
  2. value = 192.168.31.201
  3. value = 192.168.31.211
  4. value = 192.168.31.221

您应当通过如下方式定义对应的结构体:

  1. type IP struct {
  2. Value []string `ini:"value,omitempty,allowshadow"`
  3. }

如果您不需要前两个标签规则,可以使用 ini:",,allowshadow" 进行简写。

映射/反射的其它说明

任何嵌入的结构都会被默认认作一个不同的分区,并且不会自动产生所谓的父子分区关联:

  1. type Child struct {
  2. Age string
  3. }
  4. type Parent struct {
  5. Name string
  6. Child
  7. }
  8. type Config struct {
  9. City string
  10. Parent
  11. }

示例配置文件:

  1. City = Boston
  2. [Parent]
  3. Name = Unknwon
  4. [Child]
  5. Age = 21

很好,但是,我就是要嵌入结构也在同一个分区。好吧,你爹是李刚!

  1. type Child struct {
  2. Age string
  3. }
  4. type Parent struct {
  5. Name string
  6. Child `ini:"Parent"`
  7. }
  8. type Config struct {
  9. City string
  10. Parent
  11. }

示例配置文件:

  1. City = Boston
  2. [Parent]
  3. Name = Unknwon
  4. Age = 21

另请查看 自定义键名和键值映射器 的有关用法。