golang读取后缀ini文件

avatar 2023年2月12日18:12:15 评论 755 次浏览

读取后缀ini的配置文件,读取文件比较好配置,主要是读取的文件路径,如果找不到文件的路径可以使用os模块,打印出文件的当前路径,然后在配置当前路径下的绝对路径即可。可以参考:

先创建一个ini结尾的文件,然后在文件中加入一些内容,也可以自己定义。

app_name = wulaoer.org

# possible values: DEBUG, INFO, WARNING, ERROR, FATAL
log_level = DEBUG

[mysql]
ip = 127.0.0.1
port = 3306
user = wulaoer
password = 123456
database = wulaoer

操作ini文件需要用到ini模块,所以在操作之前我们需要安装一下ini模块。

go get -u github.com/go-ini/ini

安装ini模块后,在读取文件时,对于文件中[mysql]理解为分区数,mysql下的例如:ip = 127.0.0.1,ip称之为key,127.0.0.1称之为值,也就是key和value的关系。看下面的操作注释。

package main

import (
  "fmt"
  "github.com/go-ini/ini"
  "log"
)
//个人技术博客 http://www.wulaoer.org
func main() {

  cfg, err := ini.Load("learn/go-ini/app.ini")
  if err != nil {
    fmt.Println("open file faild")
  }
  fmt.Println("APPBNME:", cfg.Section("").Key("app_name").String())
  //Section中是分区,""是默认分区,后面的Key是分区中的key值,最后将结果转为String
  fmt.Println("MYSQLIP:", cfg.Section("mysql").Key("ip").String())
  //获取mysql分区的ip的值
  fmt.Println("MYSQLPORT:", cfg.Section("mysql").Key("port").Value())
  //返回Int类型的key值必须判断一下,
  mysqlpass, err := cfg.Section("mysql").Key("password").Int()
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println("MYSQLPASS:", mysqlpass)
    // 如果读取的值不在候选列表内,则会回退使用提供的默认值
  fmt.Println("Server Protocol:",
    cfg.Section("mysql").Key("port").In("80", []string{"5555", "8080"}))
  // 自动类型转换
  fmt.Printf("Port Number: (%[1]T) %[1]d\n", cfg.Section("mysql").Key("port").MustInt(9999))
  fmt.Printf("Database Name: (%[1]T) %[1]s\n", cfg.Section("mysql").Key("database").MustString("test"))
  // 修改某个值然后进行保存
  cfg.Section("").Key("version").SetValue("2.0.0")
  cfg.SaveTo("learn/go-ini/app.ini")
  for _, v := range cfg.Sections() {
    fmt.Println(v.KeyStrings())
  }
}
返回结果:
APPBNME: wulaoer.org
MYSQLIP: 127.0.0.1
MYSQLPORT: 3306
MYSQLPASS: 123456
Server Protocol: 80
Port Number: (int) 3306
Database Name: (string) wulaoer
[app_name log_level]
[ip port user password database]

使用viper模块读取ini文件内容

[wolf@wulaoer.org 🔥🔥🔥🔥 go-ini ]$ go get github.com/spf13/viper 
#导入模块
package main

import (
  "fmt"
  "github.com/spf13/viper"
)
//个人技术博客 http://www.wulaoer.org
func main() {
  config := viper.New()
  config.AddConfigPath("learn/go-ini/") // 文件所在目录
  config.SetConfigName("app")           // 文件名
  config.SetConfigType("ini")           // 文件类型

  if err := config.ReadInConfig(); err != nil {
    if _, ok := err.(viper.ConfigFileNotFoundError); ok {
      fmt.Println("找不到配置文件..")
    } else {
      fmt.Println("配置文件出错..")
    }
  }
  host := config.GetString("mysql.ip")            // 读取配置
  port := config.GetInt("mysql.port")             //读取端口
  appname := config.GetString("default.app_name") //默认分区
  fmt.Println("viper load ini: ", host, port, appname)
  //循环解析文件
  for i := range config.AllKeys() {
    fmt.Println(config.AllKeys()[i])
    fmt.Println(config.Get(config.AllKeys()[i]))
  }
  //把上面的配置文件下写入到指定文件
  config.WriteConfig() // 将当前配置写入“viper.AddConfigPath()”和“viper.SetConfigName”设置的预定义路径
  config.SafeWriteConfig()
  config.WriteConfigAs("learn/go-ini/")
  config.SafeWriteConfigAs("learn/go-ini/.config") // 因为该配置文件写入过,所以会报错
  config.SafeWriteConfigAs("learn/go-ini/.other_config")
}

以上就是针对ini后缀文件使用go读取配置文件的方法,在使用go-ini和viper之间如何选择还是根据个人喜好即可,viper也可以用在json后缀,yaml后缀文件的读取以及配置等方式,这里就不多介绍了,后期慢慢更新即可。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: