当前位置: 首页 > news >正文

godotenv拜读

简介
应用提倡将配置存储在环境变量中。任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。 但是在实际开发中,如果同一台机器运行多个项目,设置环境变量容易冲突,不实用。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 []stringif separators == nil || len(separators) == 0 {result = append(result, s)return result}start := 0for i, r := range s {// 检查当前字符是否是分隔符之一isSeparator := falsefor _, sep := range separators {if r == sep {isSeparator = truebreak}}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
}

相关文章:

godotenv拜读

简介 应用提倡将配置存储在环境变量中。任何从开发环境切换到生产环境时需要修改的东西都从代码抽取到环境变量里。 但是在实际开发中&#xff0c;如果同一台机器运行多个项目&#xff0c;设置环境变量容易冲突&#xff0c;不实用。godotenv库从.env文件中读取配置&#xff0c;…...

解析REST API与OpenAPI之差异:避免混淆

在网络API领域&#xff0c;常提及的两种术语为Rest API与Open API&#xff0c;其既存在差异亦存在联系。前者是一种API设计方式&#xff0c;后者则是一种API描述及定义规范。值得注意的是&#xff0c;OpenAPI 可用于描述和定义REST API。 什么是REST API&#xff1f; REST API …...

一篇文章就搞懂了:过虑器 、拦截器 、监听器是什么

java 过虑器 、拦截器 、监听器的区别? ‌实现原理‌&#xff1a; 过滤器基于函数回调实现。拦截器基于Java的反射机制实现。监听器用于监听特定事件的发生&#xff0c;并作出相应处理。 ‌使用范围‌&#xff1a; 过滤器依赖于Tomcat等容器&#xff0c;主要用于Web程序。拦截…...

本体映射与本体集成

文章目录 本体映射与本体集成本体映射分类知识挖掘是从己有的实体及实体关系出发挖掘新的知识,具体包括知识内容挖掘和知识结构挖掘。 本体映射与本体集成 解决本体异构的通用方法是本体集成与本体映射。本体集成直接将多个本体合并为一个大本体,本体映射则寻找本体间的映射…...

华媒舍:10种提升推特大V发文推广曝光率的方式

在社交媒体时代&#xff0c;推特已成为许多大V达到更广泛受众的重要渠道。并非所有的推文都能获得理想的曝光率。为了帮助大V们提升推文的曝光率&#xff0c;本文将介绍10种有效的方式。 1. 精心构思内容 好的内容是吸引读者和提升曝光率的关键。大V们应该从听众的角度出发&am…...

前端本地存储数据:深入解析与代码示例(Cookie、LocalStorage、SessionStorage和IndexedDB)

在现代Web应用中&#xff0c;前端本地存储是实现用户个性化体验的关键技术。本文将深入探讨前端本地存储的四种主要技术&#xff1a;Cookie、LocalStorage、SessionStorage和IndexedDB&#xff0c;并提供具体的代码示例。 Cookie 简介 Cookie是由服务器创建并存储在用户浏览…...

Java语言程序设计基础篇_编程练习题*18.21 (将十进制数转换为二进制数)

*18.21 (将十进制数转换为二进制数) 编写一个递归方法&#xff0c;将一个十进制数转换为一个二进制数的字符串。方法头如下: public static String dec2Bin(int value)编写一个测试程序&#xff0c;提示用户输入一个十进制数&#xff0c;然后显示等价的二进制数。 代码示例 …...

中年转行新可能:18 个月迈向大模型提示词工程师

【导读】 人到中年&#xff0c;想半路转行成为大模型提示词工程师&#xff0c;这可行吗&#xff1f;最近&#xff0c;一位国外小哥成功转行&#xff0c;他在一篇干货满满的硬核博客中给出了答案&#xff1a;完全可行&#xff01; 转行成为大模型提示词工程师&#xff0c;到底…...

C++通过返回值和输出参数的原理是什么?分别有什么优势和缺点?

C中&#xff0c;通过返回值和输出参数&#xff08;通常是通过引用或指针&#xff09;是函数与外部世界交换数据的两种主要方式。它们各自有着不同的原理和优缺点。 通过返回值 原理&#xff1a; 当函数通过返回值向调用者传递数据时&#xff0c;它实际上是在函数执行完毕后&…...

AI客服机器人开启企业客户服务新纪元

随着人工智能(AI)技术的迅猛发展&#xff0c;使得AI客服机器人走进了我们的视野&#xff0c;成为提高客户满意度和业务效率的不二法宝。这些智能机器人不仅能够处理海量信息&#xff0c;还能为客户提供个性化的服务体验。 一、AI客服机器人的基本原理 AI客服机器人是基于人工智…...

TPM项目课题的确定需要考虑哪些因素?

确定一个合适的TPM项目课题&#xff0c;是企业启动并成功实施TPM计划的第一步。这一过程不仅需要深入洞察企业现状&#xff0c;还需前瞻性地规划未来发展。详情如深圳天行健精益化生产管理咨询公司下文所述&#xff1a; 一、企业战略目标 1.与企业长期发展规划的契合度 -TPM项…...

Rust 数据类型

文章目录 发现宝藏1. 标量类型1.1 整型1.2 浮点型1.3 布尔型1.4 字符型 2. 复合类型2.1 元组2.2 数组 3. 总结 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 Rust 是一种静态…...

C#无标题栏窗体拖动

要实现C#无标题栏窗体的拖动功能&#xff0c;可以通过以下步骤实现&#xff1a; 在窗体的构造函数中添加以下代码&#xff0c;以去掉标题栏&#xff1a; this.FormBorderStyle FormBorderStyle.None;然后&#xff0c;添加以下代码以处理鼠标按下事件&#xff1a; private c…...

MySQL容器配置连接数数,镜像重启生效

若有不理解&#xff0c;可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 方法一 在 docker-compose.yml 中配置 MySQL 的连接数&#xff0c;可以通过环境变量或配置文件来实现。以下…...

《OpenCV计算机视觉》—— 身份证号码识别案例

文章目录 一、案例实现的整体思路二、代码实现1.首先定义两个函数2.模板图像中数字的定位处理3.身份证号码数字的定位处理4.使用模板匹配&#xff0c;计算匹配得分&#xff0c;找到正确结果 一、案例实现的整体思路 下面是一个数字0~9的模板图片 案例身份证如下&#xff1a; 对…...

如何使用正则表达式替换字符串中的特定位置数字

如何使用正则表达式替换字符串中的特定位置数字 1、效果 把字符串中的第一个123替换掉: 2、代码 使用正则中的sub函数: re.sub(pattern,repl,string,count=0,flags=0) pattern:表示需要匹配的模式,即需要被替换的字符或字符串。 repl:表示替换后的字符串或函数,用于…...

【SQL】在SQL中,行转列

在SQL中&#xff0c;行转列通常是指将数据从水平方向&#xff08;行&#xff09;转换为垂直方向&#xff08;列&#xff09;&#xff0c;这可以通过使用CASE语句或数据库特有的函数如PIVOT&#xff08;在SQL Server中&#xff09;来实现。下面我将通过一个具体的例子来说明如何…...

95. UE5 GAS RPG 实现创建多段飞弹攻击敌人

从这篇开始&#xff0c;我们将实现一些技能&#xff0c;比如多段火球术&#xff0c;闪电链等等。 在这一篇里&#xff0c;我们先实现多段火球术&#xff0c;技能可以通过配置发射出多个火球术进行攻击。 创建多段火球函数 首先在我们之前创建的RPGFireBolt.h类里面增加一个生…...

分布式集群下如何做到唯一序列号

优质博文&#xff1a;IT-BLOG-CN 分布式架构下&#xff0c;生成唯一序列号是设计系统常常会遇到的一个问题。例如&#xff0c;数据库使用分库分表的时候&#xff0c;当分成若干个sharding表后&#xff0c;如何能够快速拿到一个唯一序列号&#xff0c;是经常遇到的问题。实现思…...

在 Vue 2 中使用 Axios 发起 POST 和 GET 请求

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 node.js&#xff0c;它提供了一种非常方便的方式来发送异步 HTTP 请求。在 Vue 2 应用中&#xff0c;Axios 可以帮助我们轻松地与后端 API 进行通信。本文将介绍如何在 Vue 2 项目中引入 Axios&#xff0c;并…...

Linux内核初始化过程中加载TCP/IP协议栈

Linux内核初始化过程中加载TCP/IP协议栈 Linux内核初始化过程中加载TCP/IP协议栈&#xff0c;从start_kernel、kernel_init、do_initcalls、inet_init&#xff0c;找出Linux内核初始化TCP/IP的入口位置&#xff0c;即为inet_init函数。 Linux内核启动过程 之前的实验中我们设…...

Mysql树形结构表-查询所有子集数据

表结构&#xff0c;这里只是个例子&#xff0c;所有的树形结构表均可用&#xff1a; CREATE TABLE zhkt_course_chapter (id bigint NOT NULL COMMENT 唯一id,course_id bigint NOT NULL COMMENT 所属课程id,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general…...

Vue 3 Composition API进阶指南

在上一篇文章中&#xff0c;我们介绍了Vue 3的Composition API基础&#xff0c;包括如何使用setup函数、ref和reactive来创建响应式数据&#xff0c;以及使用watchEffect来监控数据变化。本文将继续深入探讨Composition API的高级用法&#xff0c;帮助你更好地理解和利用Vue 3的…...

C++学习,多继承

多继承&#xff0c;一个子类可以有多个父类&#xff0c;它继承了多个父类的特性。这种机制提供了强大的灵活性&#xff0c;但也带来了复杂性&#xff0c;特别是当涉及到基类中的同名成员&#xff08;包括成员函数和变量&#xff09;时。 C 类从多个类继承成员&#xff0c;语法如…...

苹果研究人员提出了一种新颖的AI算法来优化字节级表示以自动语音识别(ASR),并将其与UTF-8表示进行比较

端到端&#xff08;E2E&#xff09;神经网络已成为多语言自动语音识别&#xff08;ASR&#xff09;的灵活且准确的模型。然而&#xff0c;随着支持的语言数量增加&#xff0c;尤其是像中文、日语、韩语&#xff08;CJK&#xff09;这样大字符集的语言&#xff0c;输出层的大小显…...

2024年重磅报告!国内AI大模型产业飞速发展!

伴随人工智能技术的加速演进&#xff0c;AI 大模型已成为全球科技竞争的新高地、未来产业的新赛道、经济发展的新引擎&#xff0c;发展潜力大、应用前景广。近年来&#xff0c;我国高度重视人工智能的发展&#xff0c;将其上升为国家战略&#xff0c;出台一系列扶持政策和规划&…...

Sentinel 安装

一、下载jar包 下载地址&#xff1a;Releases alibaba/Sentinel GitHub 二、运行 将jar包放在任意非中文、不包含特殊字符的目录下&#xff0c;启动 启动命令&#xff1a;运行cmd 使用一下命令 java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -D…...

大佬,简单解释下“嵌入式软件开发”和“嵌入式硬件开发”的区别

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;首先&#xff0c;嵌入式硬…...

04 奇偶分家

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; #include<stdlib.h> #include<stdio.h>int main() {int N;cin>>N;int jicount0,oucount0;for(int i0;i<N;i){int temp;cin>>temp;if(temp%20){oucount;}else if…...

普通人秒变AI专家:李沐创业同款RAG微调实战,打造专属外卖评论大模型

8月14日晚上,李沐发布了一篇关于他创业一年的复盘文章《创业一年,人间三年》,引起了广泛关注。这篇文章中,李沐分享了从创业初期到现在的心路历程,许多读者读后都倍感激动。 创业之初,李沐的团队原本打算利用大语言模型(LLM)开发生产力工具。然而,在张一鸣的建议下,…...