godotenv拜读

简介

应用提倡将配置存储在环境变量中。任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。 但是在实际开发中,如果同一台机器运行多个项目,设置环境变量容易冲突,不实用。godotenv库从.env文件中读取配置, 然后存储到程序的环境变量中。在代码中可以使用读取非常方便。godotenv源于一个 Ruby 的开源项目dotenv。

github地址:https://github.com/joho/godotenv

这是一个比较简单的开源项目,目前拜读了,关于加载配置文件,但是parse.go 文件写的比较复杂, 自己手痒仿制一个

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
}
相关推荐
小小龙学IT4 小时前
Go语言后端开发入门指南
开发语言·后端·golang
basketball6165 小时前
Go 语言从入门到进阶:6. 一文彻底吃透结构体(Struct)
开发语言·unity·golang
木雷坞16 小时前
Go 项目实战:用 MLiev IAM 落地企业认证中心
后端·golang·认证
知彼解己1 天前
LLM-based Planning:从后端视角理解 Agent 规划层
后端·golang·ai编程
basketball6161 天前
Go语言从入门到进阶:8. 接口
开发语言·后端·golang
codeejun1 天前
每日一Go-71、理论知识:CAP 、一致性原理 、Raft 机制(简化实现一个 Raft)
java·开发语言·golang
曾几何时`1 天前
Go(一)Gin框架 和 GORM机制
开发语言·golang·gin
l齐天1 天前
Ubuntu 22.04 环境下 PBC 与 Golang 的安装、配置与测试
linux·ubuntu·golang
codeejun1 天前
每日一 Go-72、分布式事务 & 一致性:本地消息表、事务消息、SAGA、TCC怎么选?
开发语言·分布式·golang
喵了几个咪2 天前
AI重构软件开发范式:框架与脚手架为何仍是生产级开发的刚需?
vue.js·人工智能·react.js·重构·golang·ai编程