go版本的配置加载和使用

配置内容的格式形如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)
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值