{"id":"7b42a814-34ba-42ad-b05a-8920ab73db1d","shortId":"yPyWah","kind":"skill","title":"golang-web","tagline":"Modern Go Web application architecture guide. Use when creating new Go web projects, APIs, or microservices. Covers project structure, tech stack selection, and best practices based on Go standards.","description":"# Go Web Architecture\n\n## Core Principles\n\n- **Standard layout** — Follow cmd/internal/pkg convention\n- **Explicit dependencies** — Wire dependencies in main.go, no globals\n- **Interface-driven** — Define interfaces where you use them, not where you implement\n- **Error wrapping** — Wrap errors with context, use error codes\n- **No backwards compatibility** — Delete, don't deprecate. Change directly\n- **LiteLLM for LLM APIs** — Use LiteLLM proxy for all LLM integrations\n\n---\n\n## No Backwards Compatibility\n\n> **Delete unused code. Change directly. No compatibility layers.**\n\n```go\n// ❌ BAD: Deprecated function kept around\n// Deprecated: Use NewUserService instead\nfunc CreateUserService() *UserService { ... }\n\n// ❌ BAD: Alias for renamed types\ntype OldName = NewName // \"for backwards compatibility\"\n\n// ❌ BAD: Unused parameters\nfunc Process(_ context.Context, data Data) { ... }\n\n// ✅ GOOD: Just delete and update all usages\nfunc NewUserService(repo UserRepository) *UserService { ... }\n```\n\n---\n\n## LiteLLM for LLM APIs\n\n> **Use LiteLLM proxy. Don't call provider APIs directly.**\n\n```go\n// adapters/llm/client.go\npackage llm\n\nimport (\n    \"github.com/sashabaranov/go-openai\"\n)\n\n// Connect to LiteLLM proxy using OpenAI-compatible SDK\nfunc NewClient(cfg Config) *openai.Client {\n    config := openai.DefaultConfig(cfg.APIKey)\n    config.BaseURL = cfg.BaseURL // LiteLLM proxy URL\n    return openai.NewClientWithConfig(config)\n}\n```\n\n---\n\n## Quick Start\n\n### 1. Initialize Project\n\n```bash\nmkdir myapp && cd myapp\ngo mod init github.com/yourname/myapp\n\n# Install core dependencies\ngo get github.com/gin-gonic/gin\ngo get github.com/spf13/viper\ngo get github.com/sirupsen/logrus\ngo get gorm.io/gorm\n```\n\n### 2. Apply Tech Stack\n\n| Layer | Recommendation |\n|-------|----------------|\n| HTTP Framework | Gin / Chi / Echo |\n| Configuration | Viper |\n| Logging | Logrus / Zap / Slog |\n| Database ORM | GORM / sqlx / sqlc |\n| Validation | go-playground/validator |\n| Testing | testify / go test |\n\n### Version Strategy\n\n> **Always get latest. Never pin in templates.**\n\n```bash\n# Always fetch latest\ngo get -u github.com/gin-gonic/gin\ngo get -u ./...\n\n# go.mod handles version locking\n# go.sum ensures reproducible builds\n```\n\n### 3. Use Standard Structure\n\n```\nmyapp/\n├── cmd/\n│   └── myapp/\n│       └── main.go            # Entry point, dependency wiring\n├── configs/\n│   └── config.go              # Configuration struct + loader\n├── internal/                  # Private application code\n│   ├── handlers/              # HTTP handlers\n│   ├── services/              # Business logic\n│   ├── repositories/          # Data access\n│   ├── models/                # Domain models\n│   ├── middleware/            # HTTP middleware\n│   └── router/                # Route definitions\n├── pkg/                       # Public reusable packages\n│   ├── errors/                # Error types\n│   ├── logger/                # Logging setup\n│   ├── response/              # Unified response format\n│   └── database/              # Database connection\n├── config.yaml                # Configuration file\n├── Makefile                   # Build automation\n├── Dockerfile\n└── go.mod\n```\n\n---\n\n## Architecture Layers\n\n### cmd/ — Entry Point\n\nWire all dependencies here. No business logic.\n\n```go\n// cmd/myapp/main.go\nfunc main() {\n    // Load config\n    cfg := configs.Load()\n\n    // Initialize infrastructure\n    db := database.New(cfg.Database)\n    cache := cache.New(cfg.Redis)\n    logger := logger.New(cfg.Log)\n\n    // Initialize repositories\n    userRepo := repositories.NewUserRepository(db)\n\n    // Initialize services\n    userService := services.NewUserService(userRepo)\n\n    // Initialize handlers\n    userHandler := handlers.NewUserHandler(userService)\n\n    // Setup router\n    r := router.Setup(cfg, userHandler)\n\n    // Start server with graceful shutdown\n    server.Run(r, cfg.Server)\n}\n```\n\n### internal/ — Private Business Code\n\n#### handlers/ — HTTP Layer\n\n```go\n// internal/handlers/user.go\ntype UserHandler struct {\n    service services.UserService\n}\n\nfunc NewUserHandler(s services.UserService) *UserHandler {\n    return &UserHandler{service: s}\n}\n\nfunc (h *UserHandler) Create(c *gin.Context) {\n    var input CreateUserInput\n    if err := c.ShouldBindJSON(&input); err != nil {\n        response.Error(c, errors.ErrInvalidParams)\n        return\n    }\n\n    user, err := h.service.Create(c.Request.Context(), input)\n    if err != nil {\n        response.Error(c, err)\n        return\n    }\n\n    response.Success(c, user)\n}\n```\n\n#### services/ — Business Logic\n\n```go\n// internal/services/user.go\ntype UserService interface {\n    Create(ctx context.Context, input CreateUserInput) (*models.User, error)\n    GetByID(ctx context.Context, id string) (*models.User, error)\n}\n\ntype userService struct {\n    repo repositories.UserRepository\n}\n\nfunc NewUserService(repo repositories.UserRepository) UserService {\n    return &userService{repo: repo}\n}\n\nfunc (s *userService) Create(ctx context.Context, input CreateUserInput) (*models.User, error) {\n    existing, _ := s.repo.FindByEmail(ctx, input.Email)\n    if existing != nil {\n        return nil, errors.ErrUserExists\n    }\n\n    user := &models.User{\n        ID:    uuid.New().String(),\n        Email: input.Email,\n        Name:  input.Name,\n    }\n\n    return s.repo.Save(ctx, user)\n}\n```\n\n#### repositories/ — Data Access\n\n```go\n// internal/repositories/user.go\ntype UserRepository interface {\n    FindByID(ctx context.Context, id string) (*models.User, error)\n    FindByEmail(ctx context.Context, email string) (*models.User, error)\n    Save(ctx context.Context, user *models.User) (*models.User, error)\n    Delete(ctx context.Context, id string) error\n}\n\ntype userRepository struct {\n    db *gorm.DB\n}\n\nfunc NewUserRepository(db *gorm.DB) UserRepository {\n    return &userRepository{db: db}\n}\n\nfunc (r *userRepository) FindByID(ctx context.Context, id string) (*models.User, error) {\n    var user models.User\n    if err := r.db.WithContext(ctx).First(&user, \"id = ?\", id).Error; err != nil {\n        if errors.Is(err, gorm.ErrRecordNotFound) {\n            return nil, nil\n        }\n        return nil, err\n    }\n    return &user, nil\n}\n```\n\n### pkg/ — Reusable Packages\n\n#### errors/ — Error Handling\n\n```go\n// pkg/errors/errors.go\ntype AppError struct {\n    Code    int    `json:\"code\"`\n    Message string `json:\"message\"`\n    Cause   error  `json:\"-\"`\n}\n\nfunc (e *AppError) Error() string { return e.Message }\nfunc (e *AppError) Unwrap() error { return e.Cause }\n\nfunc New(code int, message string) *AppError {\n    return &AppError{Code: code, Message: message}\n}\n\nfunc Wrap(err error, code int, message string) *AppError {\n    return &AppError{Code: code, Message: message, Cause: err}\n}\n\n// Predefined errors\nvar (\n    ErrInternal      = New(500, \"internal server error\")\n    ErrInvalidParams = New(400, \"invalid parameters\")\n    ErrNotFound      = New(404, \"resource not found\")\n    ErrUnauthorized  = New(401, \"unauthorized\")\n    ErrUserExists    = New(409, \"user already exists\")\n)\n```\n\n#### response/ — Unified Response\n\n```go\n// pkg/response/response.go\ntype Response struct {\n    Code    int         `json:\"code\"`\n    Message string      `json:\"message\"`\n    Data    interface{} `json:\"data,omitempty\"`\n}\n\nfunc Success(c *gin.Context, data interface{}) {\n    c.JSON(http.StatusOK, Response{\n        Code:    0,\n        Message: \"success\",\n        Data:    data,\n    })\n}\n\nfunc Error(c *gin.Context, err error) {\n    var appErr *errors.AppError\n    if errors.As(err, &appErr) {\n        c.JSON(appErr.Code/100, Response{\n            Code:    appErr.Code,\n            Message: appErr.Message,\n        })\n        return\n    }\n    c.JSON(http.StatusInternalServerError, Response{\n        Code:    500,\n        Message: \"internal server error\",\n    })\n}\n```\n\n---\n\n## Configuration\n\n### Viper + YAML + Environment Variables\n\n```go\n// configs/config.go\ntype Config struct {\n    Server   ServerConfig   `mapstructure:\"server\"`\n    Database DatabaseConfig `mapstructure:\"database\"`\n    Redis    RedisConfig    `mapstructure:\"redis\"`\n    Log      LogConfig      `mapstructure:\"log\"`\n    LLM      LLMConfig      `mapstructure:\"llm\"`\n}\n\ntype LLMConfig struct {\n    BaseURL      string `mapstructure:\"base_url\"`\n    APIKey       string `mapstructure:\"api_key\"`\n    DefaultModel string `mapstructure:\"default_model\"`\n}\n\nfunc Load() *Config {\n    viper.SetConfigFile(\"config.yaml\")\n    viper.AutomaticEnv()\n    viper.SetEnvPrefix(\"APP\")\n    viper.SetEnvKeyReplacer(strings.NewReplacer(\".\", \"_\"))\n\n    // Defaults\n    viper.SetDefault(\"server.port\", 8080)\n    viper.SetDefault(\"llm.base_url\", \"http://localhost:4000\")\n    viper.SetDefault(\"llm.default_model\", \"gpt-4o\")\n\n    viper.ReadInConfig()\n\n    var cfg Config\n    viper.Unmarshal(&cfg)\n    return &cfg\n}\n```\n\n---\n\n## Graceful Shutdown\n\n```go\n// pkg/server/server.go\nfunc Run(handler http.Handler, cfg ServerConfig) {\n    srv := &http.Server{\n        Addr:         fmt.Sprintf(\":%d\", cfg.Port),\n        Handler:      handler,\n        ReadTimeout:  cfg.ReadTimeout,\n        WriteTimeout: cfg.WriteTimeout,\n    }\n\n    go func() {\n        if err := srv.ListenAndServe(); err != http.ErrServerClosed {\n            log.Fatalf(\"Server error: %v\", err)\n        }\n    }()\n\n    quit := make(chan os.Signal, 1)\n    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)\n    <-quit\n\n    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n    defer cancel()\n\n    srv.Shutdown(ctx)\n}\n```\n\n---\n\n## Makefile\n\n```makefile\n.PHONY: build run test lint clean\n\nAPP_NAME=myapp\n\nbuild:\n\tgo build -o bin/$(APP_NAME) ./cmd/$(APP_NAME)\n\nrun:\n\tgo run ./cmd/$(APP_NAME)\n\ndev:\n\tair\n\ntest:\n\tgo test -v ./...\n\nlint:\n\tgolangci-lint run\n\nclean:\n\trm -rf bin/\n\ntidy:\n\tgo mod tidy\n\nupgrade:\n\tgo get -u ./...\n\tgo mod tidy\n```\n\n---\n\n## Checklist\n\n```markdown\n## Project Setup\n- [ ] Go 1.21+ installed\n- [ ] Standard directory structure (cmd/internal/pkg)\n- [ ] go.mod initialized\n- [ ] Makefile created\n\n## Architecture\n- [ ] Dependencies wired in main.go\n- [ ] Handlers → Services → Repositories layers\n- [ ] Interfaces defined at usage site\n- [ ] No circular dependencies\n\n## Infrastructure\n- [ ] Configuration with Viper\n- [ ] Structured logging\n- [ ] Custom error types\n- [ ] Unified response format\n- [ ] Graceful shutdown\n\n## Quality\n- [ ] Tests for services\n- [ ] golangci-lint configured\n- [ ] go vet passes\n- [ ] Race detection tested\n```\n\n---\n\n## See Also\n\n- [reference/architecture.md](reference/architecture.md) — Detailed architecture patterns\n- [reference/tech-stack.md](reference/tech-stack.md) — Tech stack comparison\n- [reference/patterns.md](reference/patterns.md) — Go design patterns","tags":["golang","web","claude","arsenal","majiayu000","agent-skills","ai-agents","ai-coding-assistant","automation","claude-code","code-review","developer-tools"],"capabilities":["skill","source-majiayu000","skill-golang-web","topic-agent-skills","topic-ai-agents","topic-ai-coding-assistant","topic-automation","topic-claude","topic-claude-code","topic-code-review","topic-developer-tools","topic-devops","topic-productivity","topic-prompt-engineering","topic-python"],"categories":["claude-arsenal"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/majiayu000/claude-arsenal/golang-web","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add majiayu000/claude-arsenal","source_repo":"https://github.com/majiayu000/claude-arsenal","install_from":"skills.sh"}},"qualityScore":"0.464","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 29 github stars · SKILL.md body (10,678 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-01T07:01:14.085Z","embedding":null,"createdAt":"2026-04-18T22:24:11.806Z","updatedAt":"2026-05-01T07:01:14.085Z","lastSeenAt":"2026-05-01T07:01:14.085Z","tsv":"'/100,':778 '/cmd':947,953 '/gin-gonic/gin':217,282 '/gorm':232 '/sashabaranov/go-openai':168 '/sirupsen/logrus':227 '/spf13/viper':222 '/validator':259 '/yourname/myapp':209 '0':757 '1':196,913 '1.21':987 '2':233 '3':294 '400':707 '4000':860 '401':718 '404':712 '409':722 '4o':866 '5':923 '500':701,789 '8080':855 'access':323,546 'adapters/llm/client.go':162 'addr':887 'air':957 'alia':118 'alreadi':724 'also':1043 'alway':266,274 'api':17,85,151,159,835 'apikey':832 'app':849,937,945,948,954 'apperr':769,774 'apperr.code':777,781 'apperr.code/100,':776 'apperr.message':783 'apperror':639,654,661,672,674,687,689 'appli':234 'applic':7,313 'architectur':8,35,358,997,1047 'around':109 'autom':355 'backward':74,94,126 'bad':105,117,128 'base':29,830 'baseurl':827 'bash':199,273 'best':27 'bin':944,970 'build':293,354,932,940,942 'busi':319,368,420,476 'c':445,457,469,473,749,764 'c.json':753,775,785 'c.request.context':463 'c.shouldbindjson':452 'cach':383 'cache.new':384 'call':157 'cancel':920,926 'caus':649,694 'cd':202 'cfg':180,376,408,869,872,874,883 'cfg.apikey':185 'cfg.baseurl':187 'cfg.database':382 'cfg.log':388 'cfg.port':890 'cfg.readtimeout':894 'cfg.redis':385 'cfg.server':417 'cfg.writetimeout':896 'chan':911 'chang':80,99 'checklist':982 'chi':242 'circular':1012 'clean':936,967 'cmd':299,360 'cmd/internal/pkg':41,992 'cmd/myapp/main.go':371 'code':72,98,314,421,641,644,668,675,676,683,690,691,734,737,756,780,788 'comparison':1053 'compat':75,95,102,127,176 'config':181,183,193,306,375,802,844,870 'config.baseurl':186 'config.go':307 'config.yaml':350,846 'configs.load':377 'configs/config.go':800 'configur':244,308,351,794,1015,1035 'connect':169,349 'context':69 'context.background':922 'context.context':133,485,492,516,554,561,568,575,598 'context.withtimeout':921 'convent':42 'core':36,211 'cover':20 'creat':12,444,483,514,996 'createuserinput':449,487,518 'createuserservic':115 'ctx':484,491,515,523,542,553,560,567,574,597,609,919,928 'custom':1020 'd':889 'data':134,135,322,545,742,745,751,760,761 'databas':250,347,348,808,811 'database.new':381 'databaseconfig':809 'db':380,393,582,586,591,592 'default':840,852 'defaultmodel':837 'defer':925 'defin':54,1007 'definit':332 'delet':76,96,138,573 'depend':44,46,212,304,365,998,1013 'deprec':79,106,110 'design':1057 'detail':1046 'detect':1040 'dev':956 'direct':81,100,160 'directori':990 'dockerfil':356 'domain':325 'driven':53 'e':653,660 'e.cause':665 'e.message':658 'echo':243 'email':536,562 'ensur':291 'entri':302,361 'environ':797 'err':451,454,461,466,470,607,615,619,626,681,695,766,773,900,902,908 'errintern':699 'errinvalidparam':705 'errnotfound':710 'error':64,67,71,337,338,489,496,520,558,565,572,578,602,614,633,634,650,655,663,682,697,704,763,767,793,906,1021 'errors.apperror':770 'errors.as':772 'errors.errinvalidparams':458 'errors.erruserexists':530 'errors.is':618 'errunauthor':716 'erruserexist':720 'exist':521,526,725 'explicit':43 'fetch':275 'file':352 'findbyemail':559 'findbyid':552,596 'first':610 'fmt.sprintf':888 'follow':40 'format':346,1025 'found':715 'framework':240 'func':114,131,143,178,372,432,441,502,511,584,593,652,659,666,679,747,762,842,879,898 'function':107 'get':214,219,224,229,267,278,284,977 'getbyid':490 'gin':241 'gin.context':446,750,765 'github.com':167,208,216,221,226,281 'github.com/gin-gonic/gin':215,280 'github.com/sashabaranov/go-openai':166 'github.com/sirupsen/logrus':225 'github.com/spf13/viper':220 'github.com/yourname/myapp':207 'global':50 'go':5,14,31,33,104,161,204,213,218,223,228,257,262,277,283,370,425,478,547,636,729,799,877,897,941,951,959,972,976,979,986,1036,1056 'go-playground':256 'go.mod':286,357,993 'go.sum':290 'golang':2 'golang-web':1 'golangci':964,1033 'golangci-lint':963,1032 'good':136 'gorm':252 'gorm.db':583,587 'gorm.errrecordnotfound':620 'gorm.io':231 'gorm.io/gorm':230 'gpt':865 'gpt-4o':864 'grace':413,875,1026 'guid':9 'h':442 'h.service.create':462 'handl':287,635 'handler':315,317,400,422,881,891,892,1002 'handlers.newuserhandler':402 'http':239,316,328,423 'http.errserverclosed':903 'http.handler':882 'http.server':886 'http.statusinternalservererror':786 'http.statusok':754 'id':493,533,555,576,599,612,613 'implement':63 'import':165 'infrastructur':379,1014 'init':206 'initi':197,378,389,394,399,994 'input':448,453,464,486,517 'input.email':524,537 'input.name':539 'instal':210,988 'instead':113 'int':642,669,684,735 'integr':92 'interfac':52,55,482,551,743,752,1006 'interface-driven':51 'intern':311,418,702,791 'internal/handlers/user.go':426 'internal/repositories/user.go':548 'internal/services/user.go':479 'invalid':708 'json':643,647,651,736,740,744 'kept':108 'key':836 'latest':268,276 'layer':103,237,359,424,1005 'layout':39 'lint':935,962,965,1034 'litellm':82,87,148,153,171,188 'llm':84,91,150,164,820,823 'llm.base':857 'llm.default':862 'llmconfig':821,825 'load':374,843 'loader':310 'localhost':859 'lock':289 'log':246,341,816,819,1019 'log.fatalf':904 'logconfig':817 'logger':340,386 'logger.new':387 'logic':320,369,477 'logrus':247 'main':373 'main.go':48,301,1001 'make':910 'makefil':353,929,930,995 'mapstructur':806,810,814,818,822,829,834,839 'markdown':983 'messag':645,648,670,677,678,685,692,693,738,741,758,782,790 'microservic':19 'middlewar':327,329 'mkdir':200 'mod':205,973,980 'model':324,326,841,863 'models.user':488,495,519,532,557,564,570,571,601,605 'modern':4 'myapp':201,203,298,300,939 'name':538,938,946,949,955 'never':269 'new':13,667,700,706,711,717,721 'newclient':179 'newnam':124 'newuserhandl':433 'newuserrepositori':585 'newuserservic':112,144,503 'nil':455,467,527,529,616,622,623,625,629 'o':943 'oldnam':123 'omitempti':746 'openai':175 'openai-compat':174 'openai.client':182 'openai.defaultconfig':184 'openai.newclientwithconfig':192 'orm':251 'os.signal':912 'packag':163,336,632 'paramet':130,709 'pass':1038 'pattern':1048,1058 'phoni':931 'pin':270 'pkg':333,630 'pkg/errors/errors.go':637 'pkg/response/response.go':730 'pkg/server/server.go':878 'playground':258 'point':303,362 'practic':28 'predefin':696 'principl':37 'privat':312,419 'process':132 'project':16,21,198,984 'provid':158 'proxi':88,154,172,189 'public':334 'qualiti':1028 'quick':194 'quit':909,915,918 'r':406,416,594 'r.db.withcontext':608 'race':1039 'readtimeout':893 'recommend':238 'redi':812,815 'redisconfig':813 'reference/architecture.md':1044,1045 'reference/patterns.md':1054,1055 'reference/tech-stack.md':1049,1050 'renam':120 'repo':145,500,504,509,510 'repositori':321,390,544,1004 'repositories.newuserrepository':392 'repositories.userrepository':501,505 'reproduc':292 'resourc':713 'respons':343,345,726,728,732,755,779,787,1024 'response.error':456,468 'response.success':472 'return':191,437,459,471,507,528,540,589,621,624,627,657,664,673,688,784,873 'reusabl':335,631 'rf':969 'rm':968 'rout':331 'router':330,405 'router.setup':407 'run':880,933,950,952,966 's.repo.findbyemail':522 's.repo.save':541 'save':566 'sdk':177 'see':1042 'select':25 'server':411,703,792,804,807,905 'server.port':854 'server.run':415 'serverconfig':805,884 'servic':318,395,430,439,475,1003,1031 'services.newuserservice':397 'services.userservice':431,435 'setup':342,404,985 'shutdown':414,876,1027 'signal.notify':914 'site':1010 'skill' 'skill-golang-web' 'slog':249 'source-majiayu000' 'sqlc':254 'sqlx':253 'srv':885 'srv.listenandserve':901 'srv.shutdown':927 'stack':24,236,1052 'standard':32,38,296,989 'start':195,410 'strategi':265 'string':494,535,556,563,577,600,646,656,671,686,739,828,833,838 'strings.newreplacer':851 'struct':309,429,499,581,640,733,803,826 'structur':22,297,991,1018 'success':748,759 'syscall.sigint':916 'syscall.sigterm':917 'tech':23,235,1051 'templat':272 'test':260,263,934,958,960,1029,1041 'testifi':261 'tidi':971,974,981 'time.second':924 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-coding-assistant' 'topic-automation' 'topic-claude' 'topic-claude-code' 'topic-code-review' 'topic-developer-tools' 'topic-devops' 'topic-productivity' 'topic-prompt-engineering' 'topic-python' 'type':121,122,339,427,480,497,549,579,638,731,801,824,1022 'u':279,285,978 'unauthor':719 'unifi':344,727,1023 'unus':97,129 'unwrap':662 'updat':140 'upgrad':975 'url':190,831,858 'usag':142,1009 'use':10,58,70,86,111,152,173,295 'user':460,474,531,543,569,604,611,628,723 'userhandl':401,409,428,436,438,443 'userrepo':391,398 'userrepositori':146,550,580,588,590,595 'userservic':116,147,396,403,481,498,506,508,513 'uuid.new':534 'v':907,961 'valid':255 'var':447,603,698,768,868 'variabl':798 'version':264,288 'vet':1037 'viper':245,795,1017 'viper.automaticenv':847 'viper.readinconfig':867 'viper.setconfigfile':845 'viper.setdefault':853,856,861 'viper.setenvkeyreplacer':850 'viper.setenvprefix':848 'viper.unmarshal':871 'web':3,6,15,34 'wire':45,305,363,999 'wrap':65,66,680 'writetimeout':895 'yaml':796 'zap':248","prices":[{"id":"40a15d75-deaa-400c-a632-38caef6f3d2c","listingId":"7b42a814-34ba-42ad-b05a-8920ab73db1d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"majiayu000","category":"claude-arsenal","install_from":"skills.sh"},"createdAt":"2026-04-18T22:24:11.806Z"}],"sources":[{"listingId":"7b42a814-34ba-42ad-b05a-8920ab73db1d","source":"github","sourceId":"majiayu000/claude-arsenal/golang-web","sourceUrl":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/golang-web","isPrimary":false,"firstSeenAt":"2026-04-18T22:24:11.806Z","lastSeenAt":"2026-05-01T07:01:14.085Z"}],"details":{"listingId":"7b42a814-34ba-42ad-b05a-8920ab73db1d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"majiayu000","slug":"golang-web","github":{"repo":"majiayu000/claude-arsenal","stars":29,"topics":["agent-skills","ai-agents","ai-coding-assistant","automation","claude","claude-code","code-review","developer-tools","devops","productivity","prompt-engineering","python","software-development","typescript","workflows"],"license":"mit","html_url":"https://github.com/majiayu000/claude-arsenal","pushed_at":"2026-04-29T04:12:22Z","description":"52 production-ready Claude Code skills and 7 specialized agents for software development, DevOps, product workflows, and automation.","skill_md_sha":"908fd613642578832d427e19e6ef2901649f215a","skill_md_path":"skills/golang-web/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/golang-web"},"layout":"multi","source":"github","category":"claude-arsenal","frontmatter":{"name":"golang-web","description":"Modern Go Web application architecture guide. Use when creating new Go web projects, APIs, or microservices. Covers project structure, tech stack selection, and best practices based on Go standards."},"skills_sh_url":"https://skills.sh/majiayu000/claude-arsenal/golang-web"},"updatedAt":"2026-05-01T07:01:14.085Z"}}