name: go-code-writer description: 根据用户要求编写Go代码,只读访问现有项目文件,安全生成新文件 license: MIT compatibility: opencode metadata: audience: Go developers
本技能帮助用户编写Go代码文件。技能只能查看项目中的现有文件(只读),不能修改任何现有文件。根据用户要求生成新的Go代码文件,并安全地保存到指定目录。
在使用本技能前,请确保以下信息已明确:
.go扩展名)重要:如果用户未提供明确的目标目录,必须先询问确认后才能开始编写。
glob, grep, read)查看项目中的相关文件{原文件名}.backup.{序号}main.go.backup.1, main.go.backup.2{原文件名}.backup.{序号}
{原文件名}.backup.*# 原文件: /path/to/main.go
# 备份文件: /path/to/main.go.backup.1
# 如果已存在: /path/to/main.go.backup.2
“在 svc-code/internal/handlers 目录下创建一个新的HTTP处理器 user_handler.go,参考现有的 session_handler.go 模式”
已分析项目结构,找到参考文件 `svc-code/internal/handlers/session_handler.go`。
目标目录 `svc-code/internal/handlers` 存在。
目标文件 `user_handler.go` 不存在,无需备份。
正在编写新的HTTP处理器...
代码已生成并保存到:svc-code/internal/handlers/user_handler.go
目标文件 `svc-code/internal/handlers/user_handler.go` 已存在。
创建备份文件:svc-code/internal/handlers/user_handler.go.backup.1
新文件已覆盖原文件,原文件已备份。
glob:查找文件模式,理解项目结构grep:搜索代码内容,分析模式和用法read:读取现有文件内容,理解代码逻辑write:安全写入新文件(自动处理备份)question:收集用户需求和确认信息遵循项目中的 AGENTS.md 文件中定义的Go编码规范:
.go文件专注于单一主要功能log.Fatalf()终止程序main()函数中添加错误判断逻辑,简化主程序流程OrExit后缀明确标识”验证失败即退出”的函数go
// 验证数据库配置,失败即退出
func ValidateDbsConfigKeysOrExit() {
// 空配置仅警告
if config == nil {
log.Println("警告:数据库配置为空,相关功能受限")
return
}
// 关键错误直接终止
if !isValid(config) {
log.Fatalf("数据库配置错误: %v", config)
}
}
以下是一个完整的可编译示例,展示了启动验证函数的典型实现模式:
package service
import (
"log"
)
// ExampleValidateConfigOrExit 示例:启动配置验证函数
//
// 设计原则:
// 1. 使用 `OrExit` 后缀明确标识"验证失败即退出"的行为
// 2. 非关键配置缺失仅记录警告,允许继续执行
// 3. 关键配置错误直接终止程序,防止后续运行时错误
// 4. 不返回错误,简化 main() 函数的调用逻辑
//
// 在 main() 中的调用方式:
//
// func main() {
// service.ExampleValidateConfigOrExit()
// // 其他初始化...
// }
func ExampleValidateConfigOrExit() {
// 示例:检查必需的环境变量
checkRequiredEnvVarsOrExit()
// 示例:验证配置文件
validateConfigFileOrExit()
// 示例:检查外部依赖(如数据库)
checkExternalDependenciesOrExit()
log.Println("所有启动配置验证通过")
}
// checkRequiredEnvVarsOrExit 检查必需的环境变量
func checkRequiredEnvVarsOrExit() {
// 关键环境变量:缺失时直接终止
requiredVars := []string{"APP_ENV", "DATABASE_URL"}
for _, envVar := range requiredVars {
if getEnv(envVar) == "" {
log.Fatalf("必需环境变量 %s 未设置", envVar)
}
}
// 可选环境变量:缺失时仅警告
optionalVars := []string{"LOG_LEVEL", "CACHE_TTL"}
for _, envVar := range optionalVars {
if getEnv(envVar) == "" {
log.Printf("警告:可选环境变量 %s 未设置,使用默认值", envVar)
}
}
}
// validateConfigFileOrExit 验证配置文件
func validateConfigFileOrExit() {
config := loadConfig()
if config == nil {
log.Println("警告:配置文件为空,使用默认配置")
return
}
// 关键配置验证
if config.Port <= 0 {
log.Fatalf("配置错误:服务端口必须大于0,当前值:%d", config.Port)
}
if config.Timeout <= 0 {
log.Printf("警告:超时配置无效,使用默认值")
config.Timeout = 30
}
}
// checkExternalDependenciesOrExit 检查外部依赖
func checkExternalDependenciesOrExit() {
// 数据库连接检查
if err := checkDatabaseConnection(); err != nil {
log.Fatalf("数据库连接失败: %v", err)
}
// 缓存服务检查(可选)
if err := checkCacheService(); err != nil {
log.Printf("警告:缓存服务不可用,相关功能受限: %v", err)
// 允许继续执行,但记录警告
}
}
// getEnv 获取环境变量(示例辅助函数)
func getEnv(key string) string {
// 实际实现中应使用 os.Getenv()
return ""
}
// Config 配置结构体(示例)
type Config struct {
Port int
Timeout int
}
// loadConfig 加载配置(示例辅助函数)
func loadConfig() *Config {
// 实际实现中应从文件或环境变量加载配置
return nil
}
// checkDatabaseConnection 检查数据库连接(示例辅助函数)
func checkDatabaseConnection() error {
// 实际实现中应测试数据库连接
return nil
}
// checkCacheService 检查缓存服务(示例辅助函数)
func checkCacheService() error {
// 实际实现中应测试缓存服务连接
return nil
}
OrExit后缀:用于启动验证函数,表示”验证失败即退出程序”
ValidateConfigOrExit(), CheckDatabaseOrExit()Must前缀:用于初始化函数,表示”失败即panic”,慎用
MustLoadConfig(), MustConnectDB()