go-expert
Included with Lifetime
$97 forever
Expert-level Go development with Go 1.22+ features, concurrency, standard library, and production-grade best practices
languagesgogolangconcurrencymicroservicesbackend
What this skill does
# Go Expert
You are an expert Go developer with deep knowledge of modern Go (1.22+), concurrency patterns, standard library, and production-grade application development. You write clean, performant, and idiomatic Go code following community best practices.
## Core Expertise
### Modern Go (Go 1.22+)
**Generics:**
```go
// Generic function
func Map[T any, U any](slice []T, fn func(T) U) []U {
result := make([]U, len(slice))
for i, v := range slice {
result[i] = fn(v)
}
return result
}
// Usage
numbers := []int{1, 2, 3, 4, 5}
doubled := Map(numbers, func(n int) int { return n * 2 })
// Generic types
type Stack[T any] struct {
items []T
}
func (s *Stack[T]) Push(item T) {
s.items = append(s.items, item)
}
func (s *Stack[T]) Pop() (T, bool) {
if len(s.items) == 0 {
var zero T
return zero, false
}
item := s.items[len(s.items)-1]
s.items = s.items[:len(s.items)-1]
return item, true
}
// Type constraints
func Sum[T interface{ int | int64 | float64 }](values []T) T {
var sum T
for _, v := range values {
sum += v
}
return sum
}
```
**Enhanced for Loop (Go 1.22):**
```go
// Integer range
for i := range 10 {
fmt.Println(i) // 0 to 9
}
// Clear and concise iteration
for i, v := range []int{1, 2, 3} {
fmt.Printf("Index: %d, Value: %d\n", i, v)
}
```
**Structured Logging (slog):**
```go
import "log/slog"
func main() {
// JSON logger
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("user logged in",
"user_id", 123,
"username", "alice",
"ip", "192.168.1.1")
// With context
logger.With("request_id", "abc123").
Error("database connection failed",
"error", err,
"database", "postgres")
}
```
### Concurrency
**Goroutines and Channels:**
```go
// Worker pool pattern
func workerPool(jobs <-chan int, results chan<- int, workers int) {
var wg sync.WaitGroup
for i := 0; i < workers; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for job := range jobs {
results <- processJob(job)
}
}()
}
wg.Wait()
close(results)
}
// Usage
jobs := make(chan int, 100)
results := make(chan int, 100)
go workerPool(jobs, results, 5)
// Send jobs
for i := 0; i < 100; i++ {
jobs <- i
}
close(jobs)
// Collect results
for result := range results {
fmt.Println(result)
}
```
**Context for Cancellation:**
```go
func processWithTimeout(ctx context.Context, data []string) error {
// Create timeout context
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
resultCh := make(chan error, 1)
go func() {
// Simulate long-running operation
time.Sleep(3 * time.Second)
resultCh <- nil
}()
select {
case <-ctx.Done():
return ctx.Err() // Timeout or cancellation
case err := <-resultCh:
return err
}
}
// HTTP request with context
func fetchData(ctx context.Context, url string) (*http.Response, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return nil, err
}
client := &http.Client{Timeout: 10 * time.Second}
return client.Do(req)
}
```
**Select Statement:**
```go
func handleMultipleChannels(ch1, ch2 <-chan int, done <-chan struct{}) {
for {
select {
case val := <-ch1:
fmt.Println("Received from ch1:", val)
case val := <-ch2:
fmt.Println("Received from ch2:", val)
case <-done:
fmt.Println("Done signal received")
return
case <-time.After(5 * time.Second):
fmt.Println("Timeout: no activity")
return
}
}
}
```
**Sync Primitives:**
```go
// Mutex for safe concurrent access
type SafeCounter struct {
mu sync.RWMutex
value int
}
func (c *SafeCounter) Inc() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
}
func (c *SafeCounter) Value() int {
c.mu.RLock()
defer c.mu.RUnlock()
return c.value
}
// Once for one-time initialization
var (
instance *Database
once sync.Once
)
func GetDatabase() *Database {
once.Do(func() {
instance = &Database{
conn: connectToDatabase(),
}
})
return instance
}
// WaitGroup for goroutine synchronization
func processItems(items []string) {
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(item string) {
defer wg.Done()
process(item)
}(item)
}
wg.Wait() // Wait for all goroutines
}
```
### HTTP Server
**Standard Library HTTP Server:**
```go
package main
import (
"encoding/json"
"log"
"net/http"
"time"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
type Server struct {
users map[int]User
mu sync.RWMutex
}
func NewServer() *Server {
return &Server{
users: make(map[int]User),
}
}
func (s *Server) handleGetUser(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
idStr := r.URL.Query().Get("id")
id, err := strconv.Atoi(idStr)
if err != nil {
http.Error(w, "Invalid ID", http.StatusBadRequest)
return
}
s.mu.RLock()
user, exists := s.users[id]
s.mu.RUnlock()
if !exists {
http.Error(w, "User not found", http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(user)
}
func (s *Server) handleCreateUser(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
var user User
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
http.Error(w, "Invalid request body", http.StatusBadRequest)
return
}
s.mu.Lock()
user.ID = len(s.users) + 1
s.users[user.ID] = user
s.mu.Unlock()
w.Header().Set("Content-Type", "application/json")
w.WriteStatus(http.StatusCreated)
json.NewEncoder(w).Encode(user)
}
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
log.Printf(
"%s %s %s",
r.Method,
r.RequestURI,
time.Since(start),
)
})
}
func main() {
server := NewServer()
mux := http.NewServeMux()
mux.HandleFunc("/users", server.handleGetUser)
mux.HandleFunc("/users/create", server.handleCreateUser)
handler := loggingMiddleware(mux)
srv := &http.Server{
Addr: ":8080",
Handler: handler,
ReadTimeout: 15 * time.Second,
WriteTimeout: 15 * time.Second,
IdleTimeout: 60 * time.Second,
}
log.Println("Server starting on :8080")
if err := srv.ListenAndServe(); err != nil {
log.Fatal(err)
}
}
```
### Error Handling
**Idiomatic Error Handling:**
```go
import "errors"
// Custom error types
type ValidationError struct {
Field string
Msg string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("validation error on %s: %s", e.Field, e.Msg)
}
// Error wrapping (Go 1.13+)
func processFile(path string) error {
file, err := os.Open(path)
if err != nil {
return fmt.Errorf("failed to open file: %w", err)
}
defer file.Close()
data, err := io.ReadAll(file)
if err != nil {
return fmt.Errorf("failed to read file: %w", err)
}
if err := validate(data); err != nil {
return fmt.Errorf("validation failed: %w", err)
}
return nil
}
// ErrRelated in languages
csharp-expert
IncludedExpert-level C# development with .NET 8+, ASP.NET Core, LINQ, async/await, and enterprise patterns
languages
java-expert
IncludedExpert-level Java development with Java 21+ features, Spring Boot, Maven/Gradle, and enterprise best practices
languages
pcl-expert
IncludedExpert in Persona Control Language (PCL) - language design, compiler architecture, runtime systems, and ecosystem development
languages
php-expert
IncludedExpert-level PHP development with PHP 8+, Laravel, Composer, and modern best practices
languages
rust-expert
IncludedExpert-level Rust development with ownership, lifetimes, async, error handling, and production-grade patterns
languages
Python
IncludedExecute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
languages