Go: āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē Java/Python āđƒāļ™āļ›āļĩ 2026

āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰ Go āļ­āļĒāđˆāļēāļ‡āļĢāļ§āļ”āđ€āļĢāđ‡āļ§āđ‚āļ”āļĒāđƒāļŠāđ‰āļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļˆāļēāļ Java āļŦāļĢāļ·āļ­ Python Goroutine, channel, interface āđāļĨāļ° pattern āļŠāļģāļ„āļąāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļœāđˆāļēāļ™āļ­āļĒāđˆāļēāļ‡āļĢāļēāļšāļĢāļ·āđˆāļ™

āļ„āļđāđˆāļĄāļ·āļ­ Go āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē Java āđāļĨāļ° Python

Go (āļŦāļĢāļ·āļ­ Golang) āđ„āļ”āđ‰āļŠāļ–āļēāļ›āļ™āļēāļ•āļ™āđ€āļ­āļ‡āđ€āļ›āđ‡āļ™āļ āļēāļĐāļēāļ—āļĩāđˆāđ€āļĨāļ·āļ­āļāđƒāļŠāđ‰āļŠāļģāļŦāļĢāļąāļš microservice, āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ CLI āđāļĨāļ°āļĢāļ°āļšāļšāđāļšāļšāļāļĢāļ°āļˆāļēāļĒ āļŠāļĢāđ‰āļēāļ‡āđ‚āļ”āļĒ Google āđƒāļ™āļ›āļĩ 2009 āļœāļŠāļĄāļœāļŠāļēāļ™āļ„āļ§āļēāļĄāđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒāļ‚āļ­āļ‡ Python āđ€āļ‚āđ‰āļēāļāļąāļšāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļĢāļ°āļ”āļąāļš C āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāļ—āļĩāđˆāļĄāļēāļˆāļēāļ Java āļŦāļĢāļ·āļ­ Python āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļĄāļēāđƒāļŠāđ‰ Go āļ™āļąāđ‰āļ™āļĢāļēāļšāļĢāļ·āđˆāļ™āļ­āļĒāđˆāļēāļ‡āļ™āđˆāļēāļ›āļĢāļ°āļŦāļĨāļēāļ”āđƒāļˆāđ€āļĄāļ·āđˆāļ­āđāļ™āļ§āļ„āļīāļ”āļŦāļĨāļąāļāđ€āļ‚āđ‰āļēāļ—āļĩāđˆāđāļĨāđ‰āļ§

āļ—āļģāđ„āļĄāļ•āđ‰āļ­āļ‡ Go āđƒāļ™āļ›āļĩ 2026?

Go āđ€āļ›āđ‡āļ™āļĢāļēāļāļāļēāļ™āļ‚āļ­āļ‡ Docker, Kubernetes, Terraform āđāļĨāļ°āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļĨāļēāļ§āļ”āđŒāļˆāļģāļ™āļ§āļ™āļĄāļēāļ āļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒāļ—āļĩāđˆāļĢāļ§āļ”āđ€āļĢāđ‡āļ§ āļĢāļ­āļ‡āļĢāļąāļš concurrency āđāļšāļš native āđāļĨāļ°āļāļēāļĢ deploy āđ€āļ›āđ‡āļ™āđ„āļŸāļĨāđŒ binary āđ€āļ”āļĩāļĒāļ§ āļ—āļģāđƒāļŦāđ‰ Go āđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē backend āļŠāļĄāļąāļĒāđƒāļŦāļĄāđˆ

āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđāļĨāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļē Go

āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡ Go āļ—āļģāđ„āļ”āđ‰āļ‡āđˆāļēāļĒāđāļĨāļ°āļŠāļĄāđˆāļģāđ€āļŠāļĄāļ­āļšāļ™āļ—āļļāļāđāļžāļĨāļ•āļŸāļ­āļĢāđŒāļĄ āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­ go āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāļ„āļ­āļĄāđ„āļžāļĨāđŒ dependency āđāļĨāļ°āļāļēāļĢāļ—āļ”āļŠāļ­āļš

bash
# install.sh
# Installation on macOS with Homebrew
brew install go

# Installation on Linux (Ubuntu/Debian)
sudo apt update && sudo apt install golang-go

# Verify installation
go version
# go version go1.22.0 linux/amd64

āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒ Go āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄāļ‚āđ‰āļ­āļ•āļāļĨāļ‡āļ—āļĩāđˆāđ€āļ‚āđ‰āļĄāļ‡āļ§āļ”āđāļ•āđˆāđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒ āđ„āļŸāļĨāđŒ go.mod āļāļģāļŦāļ™āļ”āđ‚āļĄāļ”āļđāļĨāđāļĨāļ° dependency āļ•āđˆāļēāļ‡ āđ†

bash
# project-setup.sh
# Create a new project
mkdir my-project && cd my-project
go mod init github.com/user/my-project

# Generated structure:
# my-project/
# ├── go.mod    # Module manifest
# └── main.go   # Entry point

# Essential commands
go build          # Compile the project
go run main.go    # Compile and execute
go test ./...     # Run all tests
go fmt ./...      # Format code automatically

āđ‚āļ›āļĢāđāļāļĢāļĄ Go āđāļĢāļ

āļ•āđˆāļ­āđ„āļ›āļ™āļĩāđ‰āđ€āļ›āđ‡āļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‡āđˆāļēāļĒ āđ† āļ—āļĩāđˆāđāļŠāļ”āļ‡ syntax āļžāļ·āđ‰āļ™āļāļēāļ™āļ‚āļ­āļ‡ Go āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļš Java āđāļĨāļ° Python āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āđ„āļ”āđ‰āļŠāļąāļ”āđ€āļˆāļ™

main.gogo
package main

import "fmt"

// Program entry point
func main() {
    // Declaration with type inference
    message := "Hello, Go!"
    fmt.Println(message)

    // Explicit declaration
    var count int = 42
    fmt.Printf("Count: %d\n", count)
}

āļŠāļīāđˆāļ‡āļ—āļĩāđˆāļŠāļąāļ‡āđ€āļāļ•āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ: āđ„āļĄāđˆāļĄāļĩāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ­āļąāļ’āļ āļēāļ„ āđ„āļĄāđˆāļĄāļĩāļ§āļ‡āđ€āļĨāđ‡āļšāļĢāļ­āļšāđ€āļ‡āļ·āđˆāļ­āļ™āđ„āļ‚ āđāļĨāļ°āļāļēāļĢāļ­āļ™āļļāļĄāļēāļ™āļ›āļĢāļ°āđ€āļ āļ—āļ”āđ‰āļ§āļĒ := Go āđƒāļŦāđ‰āļ„āļ§āļēāļĄāļŠāļģāļ„āļąāļāļāļąāļšāļ„āļ§āļēāļĄāļāļĢāļ°āļŠāļąāļšāđ‚āļ”āļĒāđ„āļĄāđˆāđ€āļŠāļĩāļĒāļŠāļĨāļ°āļ„āļ§āļēāļĄāļ­āđˆāļēāļ™āļ‡āđˆāļēāļĒ

āļ•āļąāļ§āđāļ›āļĢāđāļĨāļ°āļ›āļĢāļ°āđ€āļ āļ—āļ‚āđ‰āļ­āļĄāļđāļĨāļžāļ·āđ‰āļ™āļāļēāļ™

Go āđ€āļ›āđ‡āļ™āļ āļēāļĐāļē statically typed āđāļ•āđˆāļĄāļĩāļāļēāļĢāļ­āļ™āļļāļĄāļēāļ™āļ›āļĢāļ°āđ€āļ āļ—āļ—āļĩāđˆāļĒāļ­āļ”āđ€āļĒāļĩāđˆāļĒāļĄ āļ›āļĢāļ°āđ€āļ āļ—āļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļāļĢāļ“āļĩāđƒāļŠāđ‰āļ‡āļēāļ™āļŠāđˆāļ§āļ™āđƒāļŦāļāđˆ

types.gogo
package main

import "fmt"

func main() {
    // Short declaration (inside functions only)
    name := "Alice"        // string
    age := 30              // int
    height := 1.75         // float64
    active := true         // bool

    // Explicit declaration
    var score int = 100
    var rate float64 = 3.14

    // Multiple declaration
    var (
        firstName string = "Bob"
        lastName  string = "Smith"
        points    int    = 0
    )

    // Zero values (default values)
    var count int      // 0
    var text string    // "" (empty string)
    var flag bool      // false
    var ptr *int       // nil

    fmt.Println(name, age, height, active)
}
āļ„āđˆāļē Zero āđƒāļ™ Go

āļ•āđˆāļēāļ‡āļˆāļēāļ Java āļŦāļĢāļ·āļ­ Python āļ•āļĢāļ‡āļ—āļĩāđˆ Go āļˆāļ°āļāļģāļŦāļ™āļ”āļ„āđˆāļēāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŦāđ‰āļ•āļąāļ§āđāļ›āļĢāđ€āļ›āđ‡āļ™ "zero value" āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī: 0 āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āđ€āļĨāļ‚, "" āļŠāļģāļŦāļĢāļąāļš string, false āļŠāļģāļŦāļĢāļąāļš bool, nil āļŠāļģāļŦāļĢāļąāļš pointer āđāļĨāļ° slice

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāļ°āļāļēāļĢāļ„āļ·āļ™āļ„āđˆāļēāļŦāļĨāļēāļĒāļ„āđˆāļē

Go āļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āļ„āļ·āļ™āļ„āđˆāļēāļŦāļĨāļēāļĒāļ„āđˆāļēāđ„āļ”āđ‰ āļ‹āļķāđˆāļ‡āđ€āļ›āđ‡āļ™āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļīāļ—āļĩāđˆāđƒāļŠāđ‰āļ­āļĒāđˆāļēāļ‡āļāļ§āđ‰āļēāļ‡āļ‚āļ§āļēāļ‡āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”

functions.gogo
package main

import (
    "errors"
    "fmt"
)

// Simple function with typed parameters
func add(a, b int) int {
    return a + b
}

// Multiple returns (idiomatic pattern for errors)
func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

// Named returns
func getUser(id int) (name string, age int, err error) {
    if id <= 0 {
        err = errors.New("invalid ID")
        return
    }
    name = "Alice"
    age = 30
    return
}

// Variadic function
func sum(numbers ...int) int {
    total := 0
    for _, n := range numbers {
        total += n
    }
    return total
}

func main() {
    // Simple call
    result := add(5, 3)
    fmt.Println("5 + 3 =", result)

    // Explicit error handling
    quotient, err := divide(10, 3)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Printf("10 / 3 = %.2f\n", quotient)

    // Ignore a returned value with _
    name, _, _ := getUser(1)
    fmt.Println("User:", name)

    // Variadic call
    total := sum(1, 2, 3, 4, 5)
    fmt.Println("Sum:", total)
}

Struct āđāļĨāļ° method

Struct āđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ›āļĢāļ°āļāļ­āļšāļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļŠāļĢāđ‰āļēāļ‡āļ›āļĢāļ°āđ€āļ āļ—āļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ€āļ­āļ‡āđƒāļ™ Go Method āļœāļđāļāļāļąāļšāļ›āļĢāļ°āđ€āļ āļ—āļœāđˆāļēāļ™ receiver

structs.gogo
package main

import "fmt"

// Struct definition
type User struct {
    ID       int
    Username string
    Email    string
    Active   bool
}

// Constructor (convention: NewTypeName)
func NewUser(id int, username, email string) *User {
    return &User{
        ID:       id,
        Username: username,
        Email:    email,
        Active:   true,
    }
}

// Method with value receiver (copy)
func (u User) FullInfo() string {
    status := "inactive"
    if u.Active {
        status = "active"
    }
    return fmt.Sprintf("%s <%s> (%s)", u.Username, u.Email, status)
}

// Method with pointer receiver (modification possible)
func (u *User) Deactivate() {
    u.Active = false
}

// Method with pointer receiver for modification
func (u *User) UpdateEmail(newEmail string) {
    u.Email = newEmail
}

func main() {
    // Create with constructor
    user := NewUser(1, "alice", "alice@example.com")
    fmt.Println(user.FullInfo())

    // Modify via method
    user.Deactivate()
    fmt.Println(user.FullInfo())

    // Direct creation
    user2 := User{
        ID:       2,
        Username: "bob",
        Email:    "bob@example.com",
    }
    fmt.Println(user2.FullInfo())
}
Value vs Pointer Receiver

āđƒāļŠāđ‰ pointer receiver (*User) āđ€āļĄāļ·āđˆāļ­ method āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āļŠāļ–āļēāļ™āļ°āļŦāļĢāļ·āļ­āđ€āļĄāļ·āđˆāļ­ struct āļĄāļĩāļ‚āļ™āļēāļ”āđƒāļŦāļāđˆ āđƒāļŠāđ‰ value receiver (User) āļŠāļģāļŦāļĢāļąāļš method āļ­āđˆāļēāļ™āļ­āļĒāđˆāļēāļ‡āđ€āļ”āļĩāļĒāļ§āļšāļ™ struct āļ—āļĩāđˆāđ€āļšāļē

Interface: polymorphism āđāļšāļš implicit

Interface āđƒāļ™ Go āļ–āļđāļ implement āđāļšāļš implicit āļ›āļĢāļ°āđ€āļ āļ—āļŦāļ™āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āđ„āļ›āļ•āļēāļĄ interface āļ–āđ‰āļē implement method āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āļĄāļąāļ™ āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ›āļĢāļ°āļāļēāļĻāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™

interfaces.gogo
package main

import (
    "fmt"
    "math"
)

// Interface definition
type Shape interface {
    Area() float64
    Perimeter() float64
}

// Rectangle implements Shape implicitly
type Rectangle struct {
    Width, Height float64
}

func (r Rectangle) Area() float64 {
    return r.Width * r.Height
}

func (r Rectangle) Perimeter() float64 {
    return 2 * (r.Width + r.Height)
}

// Circle also implements Shape
type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

func (c Circle) Perimeter() float64 {
    return 2 * math.Pi * c.Radius
}

// Function accepting the interface
func PrintShapeInfo(s Shape) {
    fmt.Printf("Area: %.2f, Perimeter: %.2f\n", s.Area(), s.Perimeter())
}

func main() {
    rect := Rectangle{Width: 10, Height: 5}
    circle := Circle{Radius: 7}

    // Polymorphism via interface
    PrintShapeInfo(rect)
    PrintShapeInfo(circle)

    // Slice of interfaces
    shapes := []Shape{rect, circle}
    for _, shape := range shapes {
        PrintShapeInfo(shape)
    }
}

āđāļ™āļ§āļ—āļēāļ‡āļ™āļĩāđ‰āđāļ•āļāļ•āđˆāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļŠāļīāđ‰āļ™āđ€āļŠāļīāļ‡āļˆāļēāļ Java āļ—āļĩāđˆ implements āđ€āļ›āđ‡āļ™āļŠāļīāđˆāļ‡āļˆāļģāđ€āļ›āđ‡āļ™ āđƒāļ™ Go āļāļēāļĢāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āđ€āļ›āđ‡āļ™āđāļšāļšāđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡ āđ„āļĄāđˆāđƒāļŠāđˆāđāļšāļšāļŠāļ·āđˆāļ­

āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Go āđāļĨāđ‰āļ§āļŦāļĢāļ·āļ­āļĒāļąāļ‡āļ„āļĢāļąāļš?

āļāļķāļāļāļ™āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āđāļšāļšāđ‚āļ•āđ‰āļ•āļ­āļš, flashcards āđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

Slice āđāļĨāļ° map: āļ„āļ­āļĨāđ€āļĨāļāļŠāļąāļ™āđāļšāļšāđ„āļ”āļ™āļēāļĄāļīāļ

Slice āđ€āļ›āđ‡āļ™āļĄāļļāļĄāļĄāļ­āļ‡āđāļšāļšāđ„āļ”āļ™āļēāļĄāļīāļāļšāļ™ array āđāļĨāļ° map āđ€āļ›āđ‡āļ™ hash table āđƒāļ™āļ•āļąāļ§

collections.gogo
package main

import "fmt"

func main() {
    // Slice: dynamic array
    numbers := []int{1, 2, 3, 4, 5}

    // Append elements
    numbers = append(numbers, 6, 7)

    // Slicing (similar to Python)
    subset := numbers[1:4]  // [2, 3, 4]
    fmt.Println("Subset:", subset)

    // Create slice with make
    scores := make([]int, 0, 10)  // len=0, cap=10
    scores = append(scores, 100, 95, 88)

    // Iteration with range
    for index, value := range numbers {
        fmt.Printf("numbers[%d] = %d\n", index, value)
    }

    // Map: hash table
    users := map[string]int{
        "alice": 30,
        "bob":   25,
    }

    // Add/Update
    users["charlie"] = 35

    // Check existence
    age, exists := users["alice"]
    if exists {
        fmt.Println("Alice's age:", age)
    }

    // Delete
    delete(users, "bob")

    // Map iteration
    for name, age := range users {
        fmt.Printf("%s is %d years old\n", name, age)
    }
}

āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđāļšāļš idiomatic

Go āđ„āļĄāđˆāļĄāļĩ exception āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ—āļĩāđˆāļ„āļ·āļ™āļāļĨāļąāļšāļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™ āļšāļąāļ‡āļ„āļąāļšāđƒāļŦāđ‰āļˆāļąāļ”āļāļēāļĢāļ­āļĒāđˆāļēāļ‡āđ€āļ‚āđ‰āļĄāļ‡āļ§āļ”

errors.gogo
package main

import (
    "errors"
    "fmt"
    "os"
)

// Sentinel error (for comparison)
var ErrNotFound = errors.New("resource not found")
var ErrInvalidInput = errors.New("invalid input")

// Custom error with context
type ValidationError struct {
    Field   string
    Message string
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation failed on %s: %s", e.Field, e.Message)
}

// Function returning different error types
func GetUser(id int) (string, error) {
    if id <= 0 {
        return "", &ValidationError{
            Field:   "id",
            Message: "must be positive",
        }
    }
    if id > 1000 {
        return "", ErrNotFound
    }
    return "Alice", nil
}

// Error wrapping (Go 1.13+)
func ReadConfig(path string) ([]byte, error) {
    data, err := os.ReadFile(path)
    if err != nil {
        return nil, fmt.Errorf("reading config %s: %w", path, err)
    }
    return data, nil
}

func main() {
    // Basic pattern
    user, err := GetUser(-1)
    if err != nil {
        fmt.Println("Error:", err)

        // Type assertion for custom error
        var valErr *ValidationError
        if errors.As(err, &valErr) {
            fmt.Printf("Field: %s\n", valErr.Field)
        }

        // Comparison with sentinel error
        if errors.Is(err, ErrNotFound) {
            fmt.Println("User not found")
        }
    } else {
        fmt.Println("User:", user)
    }
}
errors.Is āđāļĨāļ° errors.As

āļ•āļąāđ‰āļ‡āđāļ•āđˆ Go 1.13 āđƒāļŠāđ‰ errors.Is() āđ€āļžāļ·āđˆāļ­āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļāļąāļš sentinel error āđāļĨāļ° errors.As() āđ€āļžāļ·āđˆāļ­āļ”āļķāļ‡āļ›āļĢāļ°āđ€āļ āļ— error āđ€āļ‰āļžāļēāļ°āļˆāļēāļāļŠāļēāļĒ error āļ—āļĩāđˆāļ–āļđāļ wrap

Goroutine: concurrency āļ™āđ‰āļģāļŦāļ™āļąāļāđ€āļšāļē

Goroutine āđ€āļ›āđ‡āļ™ thread āļ™āđ‰āļģāļŦāļ™āļąāļāđ€āļšāļēāļ—āļĩāđˆāļˆāļąāļ”āļāļēāļĢāđ‚āļ”āļĒ runtime āļ‚āļ­āļ‡ Go āļāļēāļĢāđ€āļĢāļīāđˆāļĄ goroutine āđƒāļŠāđ‰āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļžāļĩāļĒāļ‡āđ„āļĄāđˆāļāļĩāđˆ KB

goroutines.gogo
package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()  // Decrement counter when done

    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup

    // Launch 5 goroutines
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)  // 'go' prefix launches the goroutine
    }

    // Wait for all goroutines to complete
    wg.Wait()
    fmt.Println("All workers completed")
}

sync.WaitGroup āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļĢāļ­āļˆāļ™āļāļ§āđˆāļē goroutine āļŦāļĨāļēāļĒāļ•āļąāļ§āļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆ āļ™āļĩāđˆāļ„āļ·āļ­ pattern āļžāļ·āđ‰āļ™āļāļēāļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļšāļšāļ‚āļ™āļēāļ™āđƒāļ™ Go

Channel: āļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡ goroutine

Channel āđ€āļ›āđ‡āļ™āļ—āđˆāļ­āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āđ€āļ āļ—āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢāļĢāļ°āļŦāļ§āđˆāļēāļ‡ goroutine āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļ‹āļīāļ‡āđ‚āļ„āļĢāđ„āļ™āļ‹āđŒāļ—āļĩāđˆāļ›āļĨāļ­āļ”āļ āļąāļĒāđāļĨāļ°āļāļēāļĢāđāļĨāļāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ

channels.gogo
package main

import (
    "fmt"
    "time"
)

func producer(ch chan<- int) {
    for i := 1; i <= 5; i++ {
        fmt.Println("Producing:", i)
        ch <- i  // Send on channel
        time.Sleep(100 * time.Millisecond)
    }
    close(ch)  // Close channel when done
}

func consumer(ch <-chan int, done chan<- bool) {
    for value := range ch {  // Iterate until closed
        fmt.Println("Consuming:", value)
    }
    done <- true
}

func main() {
    ch := make(chan int)     // Unbuffered channel
    done := make(chan bool)

    go producer(ch)
    go consumer(ch, done)

    <-done  // Wait for consumer to finish
    fmt.Println("All done")
}

Buffered channel āđāļĨāļ° select

channels_advanced.gogo
package main

import (
    "fmt"
    "time"
)

func main() {
    // Buffered channel (capacity 3)
    buffered := make(chan int, 3)
    buffered <- 1
    buffered <- 2
    buffered <- 3
    // buffered <- 4  // Would block since buffer is full

    fmt.Println(<-buffered)  // 1

    // Select: channel multiplexing
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        time.Sleep(100 * time.Millisecond)
        ch1 <- "from ch1"
    }()

    go func() {
        time.Sleep(200 * time.Millisecond)
        ch2 <- "from ch2"
    }()

    // Wait for first available message
    for i := 0; i < 2; i++ {
        select {
        case msg1 := <-ch1:
            fmt.Println("Received:", msg1)
        case msg2 := <-ch2:
            fmt.Println("Received:", msg2)
        case <-time.After(500 * time.Millisecond):
            fmt.Println("Timeout!")
        }
    }
}
āļ›āļĢāļąāļŠāļāļēāļ‚āļ­āļ‡ Go: CSP

Go āļ›āļāļīāļšāļąāļ•āļīāļ•āļēāļĄāđ‚āļĄāđ€āļ”āļĨ CSP (Communicating Sequential Processes): "āļ­āļĒāđˆāļēāļŠāļ·āđˆāļ­āļŠāļēāļĢāđ‚āļ”āļĒāļāļēāļĢāđāļŠāļĢāđŒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđāļ•āđˆāļˆāļ‡āđāļŠāļĢāđŒāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ‚āļ”āļĒāļāļēāļĢāļŠāļ·āđˆāļ­āļŠāļēāļĢ" Channel āļ›āđ‰āļ­āļ‡āļāļąāļ™ race condition

āļāļēāļĢāļ—āļ”āļŠāļ­āļšāđƒāļ™ Go

Go āļĄāļĩ framework āļ—āļ”āļŠāļ­āļšāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒāđāļ•āđˆāļĄāļĩāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđ„āļŸāļĨāđŒāļ—āļ”āļŠāļ­āļšāļĨāļ‡āļ—āđ‰āļēāļĒāļ”āđ‰āļ§āļĒ _test.go

calculator.gogo
package calculator

func Add(a, b int) int {
    return a + b
}

func Divide(a, b int) (int, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}
calculator_test.gogo
package calculator

import (
    "testing"
)

// Basic test
func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5

    if result != expected {
        t.Errorf("Add(2, 3) = %d; want %d", result, expected)
    }
}

// Table-driven tests (recommended pattern)
func TestAddTableDriven(t *testing.T) {
    tests := []struct {
        name     string
        a, b     int
        expected int
    }{
        {"positive numbers", 2, 3, 5},
        {"negative numbers", -2, -3, -5},
        {"zero", 0, 0, 0},
        {"mixed", -5, 10, 5},
    }

    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            result := Add(tt.a, tt.b)
            if result != tt.expected {
                t.Errorf("Add(%d, %d) = %d; want %d",
                    tt.a, tt.b, result, tt.expected)
            }
        })
    }
}

// Error test
func TestDivideByZero(t *testing.T) {
    _, err := Divide(10, 0)
    if err == nil {
        t.Error("Expected error for division by zero")
    }
}

// Benchmark
func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(100, 200)
    }
}

Test āļĢāļąāļ™āļ”āđ‰āļ§āļĒ go test ./... āđāļĨāļ° benchmark āļ”āđ‰āļ§āļĒ go test -bench=.

HTTP: āđ€āļ§āđ‡āļšāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāđāļšāļš minimalist

Go āđ€āļāđˆāļ‡āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ HTTP server āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļŠāļđāļ‡āļ”āđ‰āļ§āļĒ standard library

server.gogo
package main

import (
    "encoding/json"
    "log"
    "net/http"
)

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func main() {
    // Simple route
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, Go!"))
    })

    // JSON route
    http.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
        users := []User{
            {ID: 1, Name: "Alice"},
            {ID: 2, Name: "Bob"},
        }

        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(users)
    })

    // Route with method
    http.HandleFunc("/api/user", func(w http.ResponseWriter, r *http.Request) {
        switch r.Method {
        case "GET":
            w.Write([]byte("Get user"))
        case "POST":
            w.Write([]byte("Create user"))
        default:
            http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
        }
    })

    log.Println("Server starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāļ™āļĩāđ‰āļˆāļąāļ”āļāļēāļĢāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļŦāļĨāļēāļĒāļžāļąāļ™āļĢāļēāļĒāļāļēāļĢāđ„āļ”āđ‰āļ”āđ‰āļ§āļĒ goroutine āđāļ•āđˆāļĨāļ° request āļˆāļ°āļ–āļđāļāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāđƒāļ™ goroutine āļ‚āļ­āļ‡āļ•āļąāļ§āđ€āļ­āļ‡

āļŠāļĢāļļāļ›

Go āļĄāļ­āļšāđāļ™āļ§āļ—āļēāļ‡āđ€āļŠāļīāļ‡āļ›āļāļīāļšāļąāļ•āļīāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļžāļąāļ’āļ™āļē backend: syntax āđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒ āļ„āļ­āļĄāđ„āļžāļĨāđŒāđ€āļĢāđ‡āļ§ concurrency āđāļšāļš native āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļĒāļ­āļ”āđ€āļĒāļĩāđˆāļĒāļĄ āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē Java āļŦāļĢāļ·āļ­ Python āļāļēāļĢāđ€āļ›āļĨāļĩāđˆāļĒāļ™āļœāđˆāļēāļ™āļ•āđ‰āļ­āļ‡āļĒāļ­āļĄāļĢāļąāļšāļ‚āđ‰āļ­āļ•āļāļĨāļ‡āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļšāļēāļ‡āļ›āļĢāļ°āļāļēāļĢ (āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđāļšāļšāļŠāļąāļ”āđ€āļˆāļ™, generics āļ—āļĩāđˆāļˆāļģāļāļąāļ”āļāđˆāļ­āļ™ Go 1.18) āđāļ•āđˆāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒāļ”āđ‰āļēāļ™āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāđāļĨāļ°āļāļēāļĢāļšāļģāļĢāļļāļ‡āļĢāļąāļāļĐāļēāđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ—āļąāļ™āļ—āļĩ

āļĢāļēāļĒāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļžāļ·āđˆāļ­āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™

  • ✅ āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Go āļˆāļēāļāđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒāļ—āļēāļ‡āļāļēāļĢāļŦāļĢāļ·āļ­ package manager
  • ✅ āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļ„āļģāļŠāļąāđˆāļ‡ go build, go run, go test, go fmt
  • ✅ āđ€āļ‚āđ‰āļēāđƒāļˆāļ„āļ§āļēāļĄāđāļ•āļāļ•āđˆāļēāļ‡āļĢāļ°āļŦāļ§āđˆāļēāļ‡ slice āđāļĨāļ° array
  • ✅ āļ™āļģ pattern if err != nil āļĄāļēāđƒāļŠāđ‰āđƒāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”
  • ✅ āđƒāļŠāđ‰ goroutine āđāļĨāļ° channel āļŠāļģāļŦāļĢāļąāļš concurrency
  • ✅ āđ€āļ‚āļĩāļĒāļ™ table-driven test āļ”āđ‰āļ§āļĒ package testing

āđ€āļĢāļīāđˆāļĄāļāļķāļāļ‹āđ‰āļ­āļĄāđ€āļĨāļĒ!

āļ—āļ”āļŠāļ­āļšāļ„āļ§āļēāļĄāļĢāļđāđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āļ”āđ‰āļ§āļĒāļ•āļąāļ§āļˆāļģāļĨāļ­āļ‡āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđāļĨāļ°āđāļšāļšāļ—āļ”āļŠāļ­āļšāđ€āļ—āļ„āļ™āļīāļ„āļ„āļĢāļąāļš

āļĢāļ°āļšāļšāļ™āļīāđ€āļ§āļĻāļ‚āļ­āļ‡ Go āļĄāļĩāļ„āļ§āļēāļĄāļŠāļĄāļšāļđāļĢāļ“āđŒ āļĄāļĩ framework āļĒāļ­āļ”āļ™āļīāļĒāļĄāļ­āļĒāđˆāļēāļ‡ Gin, Echo āđāļĨāļ° Fiber āļŠāļģāļŦāļĢāļąāļšāļžāļąāļ’āļ™āļēāđ€āļ§āđ‡āļš āđāļĨāļ°āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļĒāđˆāļēāļ‡ Cobra āļŠāļģāļŦāļĢāļąāļš CLI āļ”āđ‰āļ§āļĒāļĢāļēāļāļāļēāļ™āļ—āļĩāđˆāļĄāļąāđˆāļ™āļ„āļ‡āđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰ āļāļēāļĢāļŠāļģāļĢāļ§āļˆāļŦāļąāļ§āļ‚āđ‰āļ­āļ‚āļąāđ‰āļ™āļŠāļđāļ‡āļ­āļĒāđˆāļēāļ‡ generics (Go 1.18+), package context āđāļĨāļ° pattern āļ‚āļ­āļ‡ concurrency āļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļĢāļ·āđˆāļ­āļ‡āļ—āļĩāđˆāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ

āđāļ—āđ‡āļ

#go
#golang
#concurrency
#goroutines
#backend

āđāļŠāļĢāđŒ

āļšāļ—āļ„āļ§āļēāļĄāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļ‚āļ­āļ‡ Go - Goroutines āđāļĨāļ° channels āđƒāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™

āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđƒāļ™ Go: Goroutines āđāļĨāļ° Channels - āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ

āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āđƒāļ™ Go āļ”āđ‰āļ§āļĒ goroutines āđāļĨāļ° channels āļĢāļđāļ›āđāļšāļšāļ‚āļąāđ‰āļ™āļŠāļđāļ‡ āļāļēāļĢāļ‹āļīāļ‡āđ‚āļ„āļĢāđ„āļ™āļ‹āđŒ āļ„āļģāļŠāļąāđˆāļ‡ select āđāļĨāļ°āđāļ™āļ§āļ—āļēāļ‡āļ›āļāļīāļšāļąāļ•āļīāļ—āļĩāđˆāļ”āļĩāļ—āļĩāđˆāļŠāļļāļ”āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđ‚āļ”āļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Go - āļ„āļđāđˆāļĄāļ·āļ­āđ€āļ•āļĢāļĩāļĒāļĄāļ•āļąāļ§āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒ

25 āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Go āļĒāļ­āļ”āļ™āļīāļĒāļĄ: āļ„āļđāđˆāļĄāļ·āļ­āļ‰āļšāļąāļšāļŠāļĄāļšāļđāļĢāļ“āđŒāļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļē

āļžāļīāļŠāļīāļ•āļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļ“āđŒ Go āļ”āđ‰āļ§āļĒ 25 āļ„āļģāļ–āļēāļĄāļ—āļĩāđˆāļ–āļđāļāļ–āļēāļĄāļšāđˆāļ­āļĒ goroutine, channel, interface āđāļĨāļ°āļĢāļđāļ›āđāļšāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļžāļĢāđ‰āļ­āļĄāļāļąāļ™āļžāļĢāđ‰āļ­āļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”

āđ€āļ•āļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄ goroutine channel āđāļĨāļ° concurrency pattern

āļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go: Goroutine, Channel āđāļĨāļ° Concurrency

āļ„āļģāļ–āļēāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go āđ€āļāļĩāđˆāļĒāļ§āļāļąāļš goroutine, channel āđāļĨāļ° concurrency pattern āļ•āđˆāļēāļ‡āđ† āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ” āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ āđāļĨāļ°āļ„āļģāļ•āļ­āļšāļĢāļ°āļ”āļąāļšāļœāļđāđ‰āđ€āļŠāļĩāđˆāļĒāļ§āļŠāļēāļāļŠāļģāļŦāļĢāļąāļšāđ€āļ•āļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļ“āđŒāđ€āļ—āļ„āļ™āļīāļ„ Go āļ›āļĩ 2026