配置内容的格式形如mysql的conf文件内容,
#开头,表示该号为注释
[ section ]格式的行,表示该行为一个配置项的开头,下面全是属于该section的内容
非空白行,以=分隔,左边是key,右边为value
加载源由开发者自行提供,可以从文件加载,也可以从第三方加载。配置加载成功后,通过sysinit.AppConfig的各个方法获取配置内容。比如 sysinit.AppConfig.String("httpport"),这是从一个非section里面获取httport的内容。如果要获取section的配置项,则使用sysinit.AppConfig.String("mysql::addr")这样的格式。
以下是源码:
package sysinit
import (
"fmt"
"strconv"
"strings"
)
var AppConfig Config
func init() {
AppConfig.CONF_CONTENT = make(map[string]string)
AppConfig.SECTION_CONF_CONTENT = make(map[string]map[string]string)
}
type Config struct {
CONF_CONTENT map[string]string
SECTION_CONF_CONTENT map[string]map[string]string
}
func (self *Config) String(key string) string {
if strings.Contains(key, "::") {
sectionKey := strings.Split(key, "::")
return self.SECTION_CONF_CONTENT[sectionKey[0]][sectionKey[1]]
}
return self.CONF_CONTENT[key]
}
func (self *Config) Int(key string) (int, error) {
if strings.Contains(key, "::") {
sectionKey := strings.Split(key, "::")
value := self.SECTION_CONF_CONTENT[sectionKey[0]][sectionKey[1]]
return strconv.Atoi(value)
}
value := self.CONF_CONTENT[key]
return strconv.Atoi(value)
}
func (self *Config) Int64(key string) (int64, error) {
if strings.Contains(key, "::") {
sectionKey := strings.Split(key, "::")
value := self.SECTION_CONF_CONTENT[sectionKey[0]][sectionKey[1]]
return strconv.ParseInt(value, 10, 64)
}
value := self.CONF_CONTENT[key]
return strconv.ParseInt(value, 10, 64)
}
func (self *Config) Float(key string) (float64, error) {
if strings.Contains(key, "::") {
sectionKey := strings.Split(key, "::")
value := self.SECTION_CONF_CONTENT[sectionKey[0]][sectionKey[1]]
return strconv.ParseFloat(value, 10)
}
value := self.CONF_CONTENT[key]
return strconv.ParseFloat(value, 10)
}
func (self *Config) Bool(key string) (bool, error) {
if strings.Contains(key, "::") {
sectionKey := strings.Split(key, "::")
value := self.SECTION_CONF_CONTENT[sectionKey[0]][sectionKey[1]]
return strconv.ParseBool(value)
}
value := self.CONF_CONTENT[key]
return strconv.ParseBool(value)
}
func LoadConfig(content string) {
if strings.Contains(content, "\r\n") {
content = strings.ReplaceAll(content, "\r\n", "\n")
}
fileRows := strings.Split(content, "\n")
curSection := ""
for _, row := range fileRows {
strRow := strings.TrimSpace(row)
if strRow == "" || strings.HasPrefix(strRow, "#") {
continue
}
if strings.HasPrefix(strings.TrimSpace(strRow), "[") && strings.HasSuffix(strings.TrimSpace(strRow), "]") {
section := strings.TrimSpace(strRow[1 : len(strRow)-1])
AppConfig.SECTION_CONF_CONTENT[section] = make(map[string]string)
curSection = section
continue
}
key := strings.TrimSpace(strRow[0:strings.Index(strRow, "=")])
if strings.HasPrefix(key, "\"") {
key = key[1:len(key)]
}
if strings.HasSuffix(key, "\"") {
key = key[0 : len(key)-1]
}
value := strings.TrimSpace(strRow[strings.Index(strRow, "=")+1 : len(strRow)])
if strings.HasPrefix(value, "\"") {
value = value[1:len(value)]
}
if strings.HasSuffix(value, "\"") {
value = value[0 : len(value)-1]
}
if curSection != "" {
AppConfig.SECTION_CONF_CONTENT[curSection][key] = value
} else {
AppConfig.CONF_CONTENT[key] = value
}
}
fmt.Println("初始化配置文件完成:", AppConfig.CONF_CONTENT)
}