Go语言从入门到规范-6.9、Go处理yml和ini文件
Go语言从入门到规范-6.9、Go处理yml和ini文件
1. 前言
一般yml和ini都是作为配置文件来使用的,但是实际上它们都是一种新的语言,主要是方便序列化数据便于我们进行互联网数据传输而创建的,虽然它们没有json和xml那么频繁的使用,但是也是有很多使用场景的,之前我们已经对yml做了简单介绍:https://blog.csdn.net/weixin_39510813/article/details/115633101
接下来我们再对ini做学习和总结。
2. ini概念
2.1 概述
INI文件是一种无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统上,许多程序也会采用INI文件做为配置文件之用。Windows操作系统后来以注册表的形式取代掉INI档。INI文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。有时候,INI文件也会以不同的扩展名,如“.CFG”、“.CONF”、或是“.TXT”代替。
目前还有很多程序和软件使用ini文件进行初始化以及作为一些配置文件来使用。
2.2 格式
节:section
参数:键=值 name=value
注解:注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。
2.3 示例
; last modified 1 April 2001 by John Doe
[owner]
name=John Doe
organization=Acme Products
[database]
server=192.0.2.42 ; use IP address in case network name resolution is not working
port=143
file="acme payroll.dat"
比如mysql数据我们就可以借助ini文件对其进行一些配置。
3. Go语言处理ini文件
gopkg.in/ini.v1
使用说明:
https://ini.unknwon.io/docs/intro/getting_started
创建一个my.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
很好,接下来我们需要编写 main.go 文件来操作刚才创建的配置文件。
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)
}
// 典型读取操作,默认分区可以使用空字符串表示
fmt.Println("App Mode:", cfg.Section("").Key("app_mode").String())
fmt.Println("Data Path:", cfg.Section("paths").Key("data").String())
// 我们可以做一些候选值限制的操作
fmt.Println("Server Protocol:",
cfg.Section("server").Key("protocol").In("http", []string{"http", "https"}))
// 如果读取的值不在候选列表内,则会回退使用提供的默认值
fmt.Println("Email Protocol:",
cfg.Section("server").Key("protocol").In("smtp", []string{"imap", "smtp"}))
// 试一试自动类型转换
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))
// 差不多了,修改某个值然后进行保存
cfg.Section("").Key("app_mode").SetValue("production")
cfg.SaveTo("my.ini.local")
}
结果:
App Mode: development
Data Path: /home/git/grafana
Server Protocol: http
Email Protocol: smtp
Port Number: (int) 9999
Enforce Domain: (bool) true
上一篇: php + nginx 装配
下一篇: 问答网站需要用到哪些算法?