Skip to content

Commit 2fcc7de

Browse files
committed
fix: 修复服务报错无法启动 && 增加对gemini的支持
1 parent 38e10a4 commit 2fcc7de

4 files changed

Lines changed: 57 additions & 2 deletions

File tree

.gemini/system.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
你是一名资深的 Go 语言后端架构师。
2+
3+
你的核心任务是协助我完成一个翻墙订阅链接服务系统的开发。
4+
5+
在提供任何回答、建议或代码时,你必须严格遵守 `GEMINI.md` 文件中定义的项目架构、技术栈、业务逻辑和编码规范。你的所有输出都应是专业、严谨且高度符合项目上下文的。
6+
7+
请查看`README.md`对于此项目的介绍

GEMINI.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# 项目上下文:翻墙订阅链接服务
2+
3+
---
4+
5+
## 1. Go 编码规范
6+
7+
### 1.1. 语法与性能
8+
9+
* **语法糖**: 尽量尝试使用go新语法和语法糖,如泛型等, 根据go.mod上的go版本。
10+
* **字符串拼接**: 对于多个字符串的拼接,必须使用 `strings.Builder` 来提升性能。
11+
* **预分配内存**: 使用 `make` 创建 slice 或 map 时,应根据预估大小设置初始容量,以减少内存重新分配。
12+
* **大 Slice 切片**: 从大 slice 中切取一小部分后,建议使用 `copy` 创建新 slice,以帮助垃圾回收器释放不再使用的内存。
13+
* **JSON 标签**: 熟练使用 `json:"-"` 来忽略字段,以及 `json:"fieldName,omitempty"` 来忽略空值字段。
14+
* **go协程**: 尽量使用go协程提高并发, 分析是否有必要使用到`chan`
15+
* **事务**: 事务内非必要不做查询操作。
16+
* **命名**: 变量,常量,文件 等命名务必要简洁且规范, 同时避免使用单个字母的命名。
17+
18+
### 1.2. 并发安全
19+
20+
* **协程管理**: 推荐使用 `errgroup` 来管理一组协程的生命周期和错误。
21+
* **Panic 处理**: 任何 `go` 启动的协程内部,都必须使用 `defer``recover` 来捕获潜在的 `panic`,防止主程序崩溃。
22+
* **循环闭包**: 在 `for` 循环中启动协程,必须将循环变量作为参数传入,以避免闭包陷阱。
23+
* **单次执行**: 使用 `sync.Once.Do` 确保配置加载等初始化操作只执行一次。
24+
* **并发读写**: 读多写少的场景优先使用 `sync.RWMutex`
25+
* **数据竞争**: 使用协程时, 避免数据竞争和闭包陷阱,确保内存安全。
26+
27+
### 1.3. 健壮性与设计模式
28+
29+
* **依赖注入 (DI)**: 优先通过函数参数传递依赖(如数据库连接),严格避免在函数内部调用全局变量。
30+
* **上下文 (Context)**: 所有可能阻塞或涉及 I/O 的函数,其第一个参数都应是 `context.Context`,用于控制超时和取消。
31+
* **错误处理**:
32+
* 必须对所有可能返回 `error` 的函数进行检查。
33+
* 查询数据库后,必须显式处理 `sql.ErrNoRows` 的情况。
34+
* **Map 安全**: 读取 map 时,必须使用 `value, ok := m["key"]` 的双返回值形式进行安全判断。
35+
* **空指针防御**: 对配置文件、反序列化等外部数据源保持警惕,做好 `nil` 检查。
36+
37+
### 1.4. 禁止事项
38+
39+
* **禁止 `fmt`**: 在业务逻辑代码中,使用项目配置的结构化日志库,禁止使用 `fmt` 包打印日志。
40+
* **禁止滥用 `init`**: 尽量将初始化逻辑放在 `main` 函数或构造函数中。
41+
* **禁止可变全局变量**: 避免使用任何可能在运行时被修改的全局变量。
42+
* **注意 Map 无序**: 不要编写任何依赖 `for range` 遍历 `map` 顺序的代码。
43+
44+
## 7. 其他
45+
46+
* **redis使用**: 避免 缓存穿透、缓存击穿、缓存雪崩 等问题。
47+
* 如果改动配置文件, 则必须同步以下文件: 配置事例文件位于目录下的`config.example.yaml`, 对应go代码文件`model/config/default.go``model/config/child.go`.
48+
* 善用`utils/tool.go`下的工具类,避免出现重复代码。

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/twbworld/proxy
22

3-
go 1.24.4
3+
go 1.25
44

55
require (
66
github.com/fsnotify/fsnotify v1.8.0

initialize/system/tg.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func tgStart() error {
4242
return fmt.Errorf("获取webhook失败: %w", err)
4343
}
4444
if info.LastErrorDate != 0 {
45-
return fmt.Errorf("获取tg信息错误[9e0rtji]: %s", info.LastErrorMessage)
45+
global.Log.Warnf("获取tg信息错误(可忽略)[9e0rtji]: %s", info.LastErrorMessage)
4646
}
4747

4848
global.Log.Printf("成功配置tg[doiasjo]: %s", global.Bot.Self.UserName)

0 commit comments

Comments
 (0)