--- name: go-programming-expert description: "Expert-level skill for Go programming (Go 1.24+ / 1.25+). Covers Swiss Table maps, weak pointers, synctest concurrency testing, tool directives, sqlc, net/http, and microservices in English and Indonesian." author: "Roedy Rustam" version: "4.4.2" --- # Go Programming Expert (Go 1.24 / 1.25 Edition) [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Orchestration & Integration Connects and orchestrates with domain skills: - **API Design & Protocols**: `api-design-expert`, `openapi-swagger-codegen-expert`, and `spec-driven-development-expert` for gRPC/protobuf contract design, REST endpoints, and RFC 9457 Problem Details. - **Data Persistence**: `database-orm-expert` for sqlc type-safe query generation, `pgx/v5` connection pooling, and transactional data integrity. - **Realtime & Streaming**: `sse-websocket-streaming-expert` for goroutine-backed streaming pipelines and low-latency WebSocket hubs. - **Testing & Quality**: `autonomous-tdd-debugger`, `e2e-testing-expert`, and `anti-slop` for executing `go test -v ./...`, synthetic clock testing via `testing/synctest`, and strict error checking (`if err != nil`). - **Orchestration**: `brainstorming` and `zero-to-prod-orchestrator` (Phase 4: Backend & APIs). ### Description Expert-level Go development for building high-performance microservices, concurrent pipelines, and production CLI tools. Covers **Go 1.24+ and 1.25** features (Swiss Table maps, weak pointers, `testing/synctest` deterministic concurrency testing, `tool` directives in `go.mod`), structured logging with `slog`, enhanced ServeMux pattern routing, sqlc type-safe SQL, and robust worker pools. ### Trigger Conditions - Writing Go 1.24+ / 1.25+ microservices, APIs, or high-throughput distributed workers. - Utilizing Go 1.24+ Swiss Table optimizations, weak pointers (`weak.Pointer`), or generic type aliases. - Running deterministic concurrency tests using `testing/synctest` without flaky `time.Sleep`. - Managing tool dependencies using the official `tool` directive in `go.mod`. - Writing type-safe SQL with **sqlc** or connection-pooled PostgreSQL with **pgx/v5**. - Building HTTP servers using standard `net/http` ServeMux method & wildcard routing. --- ### Go 1.24 / 1.25 Core Architectural Features #### 1. Go 1.24+ Tool Dependencies in `go.mod` Go 1.24 standardizes executable developer tooling dependencies directly in `go.mod`, eliminating legacy `tools.go` boilerplate: ```bash # Add a tool dependency go get -tool github.com/sqlc-dev/sqlc/cmd/sqlc@latest go get -tool github.com/golangci/golangci-lint/cmd/golangci-lint@latest # Run the tool directly go tool sqlc generate go tool golangci-lint run ``` ```go // go.mod snippet tool ( github.com/sqlc-dev/sqlc/cmd/sqlc github.com/golangci/golangci-lint/cmd/golangci-lint ) ``` #### 2. Weak Pointers (`weak.Pointer`) & In-Memory Caching Go 1.24 introduces `weak.Make()` and `weak.Pointer` to reference heap objects without preventing the Garbage Collector from freeing them: ```go package cache import ( "sync" "weak" ) type Session struct { UserID string AuthToken string } type WeakSessionCache struct { mu sync.RWMutex store map[string]weak.Pointer[Session] } func NewWeakSessionCache() *WeakSessionCache { return &WeakSessionCache{ store: make(map[string]weak.Pointer[Session]), } } func (c *WeakSessionCache) Set(key string, session *Session) { c.mu.Lock() defer c.mu.Unlock() c.store[key] = weak.Make(session) } func (c *WeakSessionCache) Get(key string) (*Session, bool) { c.mu.RLock() defer c.mu.RUnlock() ptr, ok := c.store[key] if !ok { return nil, false } // Dereference: returns nil if GC reclaimed the session val := ptr.Value() if val == nil { return nil, false } return val, true } ``` #### 3. Deterministic Concurrency Testing with `testing/synctest` Go 1.24 introduces `testing/synctest` (GOEXPERIMENT=synctest) to test concurrent code with virtual clocks: ```go package queue_test import ( "context" "testing" "testing/synctest" "time" ) func TestWorkerTimeout(t *testing.T) { synctest.Run(func() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() resultChan := make(chan string, 1) go func() { // Virtual time advances instantaneously when all goroutines in the bubble are idle time.Sleep(10 * time.Second) resultChan <- "completed" }() select { case res := <-resultChan: t.Fatalf("unexpected success: %s", res) case <-ctx.Done(): // Successfully verified timeout without waiting 5 real seconds! t.Log("Worker timed out deterministically") } }) } ``` #### 4. Range-Over-Func Iterators (Go 1.24+ Standard) Stream sequence processing with zero slice allocations: ```go package iterator import "iter" type Transaction struct { ID string Amount int64 Failed bool } // Custom iterator filtering successful transactions func SuccessfulTransactions(txs []Transaction) iter.Seq[Transaction] { return func(yield func(Transaction) bool) { for _, tx := range txs { if !tx.Failed { if !yield(tx) { return // Stop iteration early if consumer breaks } } } } } // Consumer loop func TotalRevenue(txs []Transaction) int64 { var total int64 for tx := range SuccessfulTransactions(txs) { total += tx.Amount } return total } ``` #### 5. HTTP Microservice with `net/http` ServeMux & `log/slog` Zero-dependency HTTP server with method routing, path parameters, and structured JSON telemetry: ```go package main import ( "encoding/json" "log/slog" "net/http" "os" ) type UserResponse struct { ID string `json:"id"` Role string `json:"role"` } func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})) slog.SetDefault(logger) mux := http.NewServeMux() // Method and path parameter matching mux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"status":"healthy"}`)) }) mux.HandleFunc("GET /api/v1/users/{id}", func(w http.ResponseWriter, r *http.Request) { userID := r.PathValue("id") slog.Info("retrieving user profile", "user_id", userID, "remote_addr", r.RemoteAddr) w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(UserResponse{ID: userID, Role: "member"}) }) slog.Info("starting production server", "port", 8080) if err := http.ListenAndServe(":8080", mux); err != nil { slog.Error("server exited", "error", err) os.Exit(1) } } ``` #### 6. Type-Safe SQL with sqlc & pgx/v5 ```sql -- queries/users.sql -- name: GetUser :one SELECT id, name, email, created_at FROM users WHERE id = $1 LIMIT 1; -- name: CreateUser :one INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id, name, email, created_at; ``` ```go // Consuming generated sqlc code package handler import ( "context" "example/internal/db" "github.com/jackc/pgx/v5/pgxpool" ) type UserHandler struct { queries *db.Queries pool *pgxpool.Pool } func (h *UserHandler) Create(ctx context.Context, name, email string) (*db.User, error) { user, err := h.queries.CreateUser(ctx, db.CreateUserParams{ Name: name, Email: email, }) if err != nil { return nil, err } return &user, nil } ``` ### Sovereign Execution, Token Efficiency & Invariants | Dimension | Sovereign Mandate & Deterministic Contract | | :--- | :--- | | **Frontier Model Cascade** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) | | **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out | | **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec go-programming-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **NFR & Anti-Slop Invariants** | P99 API Gateway Latency < 85ms, OpenAPI 3.1 / TypeSpec strict schema parity, RFC 9457 Problem Details error contracts, Idempotency-Key enforcement; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` | --- --- ## Bahasa Indonesia ### Integrasi Orkestrasi Terhubung dan mengorkestrasi bersama skill domain: - **Desain & Protokol API**: `api-design-expert`, `openapi-swagger-codegen-expert`, dan `spec-driven-development-expert` untuk kontrak gRPC/protobuf, endpoint REST, dan spesifikasi RFC 9457 Problem Details. - **Persistensi Data**: `database-orm-expert` untuk pembuatan query type-safe via sqlc, connection pooling `pgx/v5`, dan integritas transaksi database. - **Realtime & Streaming**: `sse-websocket-streaming-expert` untuk pipeline streaming berbasis channel goroutine dan hub WebSocket berlatensi rendah. - **Pengujian & Kualitas**: `autonomous-tdd-debugger`, `e2e-testing-expert`, dan `anti-slop` untuk eksekusi `go test -v ./...`, pengujian jam sintetis dengan `testing/synctest`, dan penegakan penanganan error ketat (`if err != nil`). - **Orkestrator Utama**: `brainstorming` dan `zero-to-prod-orchestrator` (Fase 4: Backend & APIs). ### Deskripsi Panduan Go tingkat ahli untuk membangun microservices, pipeline konkurensi, dan CLI tool berkinerja tinggi. Mencakup fitur **Go 1.24+ dan 1.25** (optimasi hash map Swiss Table, weak pointer, pengujian deterministik `testing/synctest`, direktif `tool` di `go.mod`), structured logging dengan `slog`, ServeMux `net/http` dengan pola pencocokan rute modern, sqlc untuk SQL type-safe, dan worker pool tangguh. ### Kondisi Pemicu - Menulis microservices atau backend API Go 1.24+/1.25+ berthroughput tinggi. - Menggunakan optimasi hash map Swiss Table, weak pointer (`weak.Pointer`), atau generic type alias. - Menjalankan pengujian konkurensi deterministik menggunakan `testing/synctest` tanpa `time.Sleep` yang rapuh. - Mengelola dependensi perkakas pengembang secara resmi melalui direktif `tool` di `go.mod`. - Menulis SQL type-safe dengan **sqlc** atau koneksi database PostgreSQL dengan **pgx/v5**. --- ### Fitur Arsitektur Inti Go 1.24 / 1.25 #### 1. Direktif Perkakas `tool` di `go.mod` (Standar Go 1.24+) Go 1.24 menstandardisasi pelacakan perkakas dependensi biner langsung di dalam `go.mod`, menghapus trik lawas `tools.go`: ```bash # Menambahkan dependensi tool go get -tool github.com/sqlc-dev/sqlc/cmd/sqlc@latest go get -tool github.com/golangci/golangci-lint/cmd/golangci-lint@latest # Menjalankan tool langsung go tool sqlc generate go tool golangci-lint run ``` #### 2. Weak Pointer (`weak.Pointer`) untuk Cache Memori Ramah GC Go 1.24 menyediakan `weak.Make()` dan `weak.Pointer` untuk menunjuk memori tanpa menghalangi Garbage Collector membersihkannya: ```go package cache import ( "sync" "weak" ) type SesiPengguna struct { UserID string AuthToken string } type CacheSesiWeak struct { mu sync.RWMutex store map[string]weak.Pointer[SesiPengguna] } func NewCacheSesiWeak() *CacheSesiWeak { return &CacheSesiWeak{ store: make(map[string]weak.Pointer[SesiPengguna]), } } func (c *CacheSesiWeak) Set(kunci string, sesi *SesiPengguna) { c.mu.Lock() defer c.mu.Unlock() c.store[kunci] = weak.Make(sesi) } func (c *CacheSesiWeak) Get(kunci string) (*SesiPengguna, bool) { c.mu.RLock() defer c.mu.RUnlock() ptr, ada := c.store[kunci] if !ada { return nil, false } // Dereferensi: mengembalikan nil jika GC telah mengumpulkan memori sesi nilai := ptr.Value() if nilai == nil { return nil, false } return nilai, true } ``` #### 3. Pengujian Konkurensi Determinis Menggunakan `testing/synctest` Go 1.24 memperkenalkan `testing/synctest` untuk menguji alur waktu asinkron dengan jam virtual seketika: ```go package antrean_test import ( "context" "testing" "testing/synctest" "time" ) func TestBatasWaktuPekerja(t *testing.T) { synctest.Run(func() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() hasilChan := make(chan string, 1) go func() { // Waktu virtual maju seketika saat seluruh goroutine menganggur time.Sleep(10 * time.Second) hasilChan <- "sukses" }() select { case hasil := <-hasilChan: t.Fatalf("alur gagal: menerima data di luar batas waktu %s", hasil) case <-ctx.Done(): // Berhasil diverifikasi tanpa menunggu 5 detik waktu riil! t.Log("Pekerja berhasil timeout secara deterministik") } }) } ``` #### 4. Iterator Range-Over-Func Pemrosesan koleksi secara streaming tanpa alokasi memori berlebih: ```go package iterator import "iter" type Transaksi struct { ID string Nominal int64 Gagal bool } func TransaksiSukses(daftar []Transaksi) iter.Seq[Transaksi] { return func(yield func(Transaksi) bool) { for _, tx := range daftar { if !tx.Gagal { if !yield(tx) { return } } } } } ``` ### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian | Dimensi | Mandat Berdaulat & Kontrak Deterministik | | :--- | :--- | | **Kaskade Model Frontier** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) | | **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) | | **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out | | **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec go-programming-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` | | **Invarian NFR & Anti-Slop** | Latensi P99 API < 85ms, paritas skema ketat OpenAPI 3.1 / TypeSpec, kontrak error RFC 9457 Problem Details, penegakan Idempotency-Key; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |