简介
应用提倡将配置存储在环境变量中。任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。 但是在实际开发中,如果同一台机器运行多个项目,设置环境变量容易冲突,不实用。godotenv库从.env文件中读取配置, 然后存储到程序的环境变量中。在代码中可以使用读取非常方便。godotenv源于一个 Ruby 的开源项目dotenv。
github地址:https://github.com/joho/godotenv
这是一个比较简单的开源项目,目前拜读了,关于加载配置文件,但是parse.go 文件写的比较复杂, 自己手痒仿制一个
func readFile(cfgPathCol ...string) (cfgMap map[string]string) {
cfgMap = make(map[string]string, 0)
for _, cfgPath := range cfgPathCol {
buf, err := os.ReadFile(cfgPath)
if err != nil {
log.Error("读取数据失败:", err)
continue
}
rowByteBuf := []byte("\n")
buf = append(bytes.ReplaceAll(buf, []byte("\r\n"), rowByteBuf), rowByteBuf...)
for {
rowEndIndex := bytes.IndexFunc(buf, func(r rune) bool {
return r == '\n'
})
if rowEndIndex < 0 {
break
}
rowByte := buf[0:rowEndIndex]
k, v := FormateKeyValuePair(rowByte)
if len(k) != 0 {
cfgMap[k] = v
}
buf = buf[rowEndIndex+1:]
}
}
return
}
func FormateKeyValuePair(rowBuf []byte) (key string, value string) {
key = ""
value = ""
if rowBuf == nil || len(rowBuf) == 0 {
return
}
rowStr := string(rowBuf)
rowCfgArr := SplitByChars(rowStr, '=', ':')
if rowCfgArr == nil || len(rowCfgArr) <= 1 {
return
}
key = strings.TrimFunc(rowCfgArr[0], func(r rune) bool {
return unicode.IsSpace(r)
})
value = strings.TrimFunc(rowCfgArr[1], func(r rune) bool {
return unicode.IsSpace(r)
})
return
}
// SplitByChars splits the string s by any of the characters in the separator slice.
func SplitByChars(s string, separators ...rune) []string {
var result []string
if separators == nil || len(separators) == 0 {
result = append(result, s)
return result
}
start := 0
for i, r := range s {
// 检查当前字符是否是分隔符之一
isSeparator := false
for _, sep := range separators {
if r == sep {
isSeparator = true
break
}
}
if isSeparator {
// 如果是分隔符,添加从开始到当前位置(不包括分隔符)的子字符串到结果切片
if start < i {
result = append(result, s[start:i])
}
// 更新起始位置为当前位置+1(即跳过分隔符)
start = i + 1
}
}
// 添加最后一个部分(如果存在)
if start < len(s) {
result = append(result, s[start:])
}
return result
}