Go: āļāļ·āđāļāļāļēāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļē Java/Python āđāļāļāļĩ 2026
āđāļĢāļĩāļĒāļāļĢāļđāđ Go āļāļĒāđāļēāļāļĢāļ§āļāđāļĢāđāļ§āđāļāļĒāđāļāđāļāļĢāļ°āļŠāļāļāļēāļĢāļāđāļāļēāļ Java āļŦāļĢāļ·āļ Python Goroutine, channel, interface āđāļĨāļ° pattern āļŠāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļāđāļēāļāļāļĒāđāļēāļāļĢāļēāļāļĢāļ·āđāļ

Go (āļŦāļĢāļ·āļ Golang) āđāļāđāļŠāļāļēāļāļāļēāļāļāđāļāļāđāļāđāļāļ āļēāļĐāļēāļāļĩāđāđāļĨāļ·āļāļāđāļāđāļŠāļģāļŦāļĢāļąāļ microservice, āđāļāļĢāļ·āđāļāļāļĄāļ·āļ CLI āđāļĨāļ°āļĢāļ°āļāļāđāļāļāļāļĢāļ°āļāļēāļĒ āļŠāļĢāđāļēāļāđāļāļĒ Google āđāļāļāļĩ 2009 āļāļŠāļĄāļāļŠāļēāļāļāļ§āļēāļĄāđāļĢāļĩāļĒāļāļāđāļēāļĒāļāļāļ Python āđāļāđāļēāļāļąāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļĢāļ°āļāļąāļ C āļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāļāļĩāđāļĄāļēāļāļēāļ Java āļŦāļĢāļ·āļ Python āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļĄāļēāđāļāđ Go āļāļąāđāļāļĢāļēāļāļĢāļ·āđāļāļāļĒāđāļēāļāļāđāļēāļāļĢāļ°āļŦāļĨāļēāļāđāļāđāļĄāļ·āđāļāđāļāļ§āļāļīāļāļŦāļĨāļąāļāđāļāđāļēāļāļĩāđāđāļĨāđāļ§
Go āđāļāđāļāļĢāļēāļāļāļēāļāļāļāļ Docker, Kubernetes, Terraform āđāļĨāļ°āđāļāļĢāļāļŠāļĢāđāļēāļāļāļ·āđāļāļāļēāļāļāļĨāļēāļ§āļāđāļāļģāļāļ§āļāļĄāļēāļ āļāļēāļĢāļāļāļĄāđāļāļĨāđāļāļĩāđāļĢāļ§āļāđāļĢāđāļ§ āļĢāļāļāļĢāļąāļ concurrency āđāļāļ native āđāļĨāļ°āļāļēāļĢ deploy āđāļāđāļāđāļāļĨāđ binary āđāļāļĩāļĒāļ§ āļāļģāđāļŦāđ Go āđāļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļē backend āļŠāļĄāļąāļĒāđāļŦāļĄāđ
āļāļēāļĢāļāļīāļāļāļąāđāļāđāļĨāļ°āļāļąāđāļāļāđāļē Go
āļāļēāļĢāļāļīāļāļāļąāđāļ Go āļāļģāđāļāđāļāđāļēāļĒāđāļĨāļ°āļŠāļĄāđāļģāđāļŠāļĄāļāļāļāļāļļāļāđāļāļĨāļāļāļāļĢāđāļĄ āđāļāļĢāļ·āđāļāļāļĄāļ·āļ go āļāļąāļāļāļēāļĢāļāļēāļĢāļāļāļĄāđāļāļĨāđ dependency āđāļĨāļ°āļāļēāļĢāļāļāļŠāļāļ
# 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 āļāđāļēāļ āđ
# 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 āļāđāļ§āļĒāđāļŦāđāđāļŦāđāļāļāļ§āļēāļĄāđāļāļāļāđāļēāļāđāļāđāļāļąāļāđāļāļ
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 āđāļāđāļĄāļĩāļāļēāļĢāļāļāļļāļĄāļēāļāļāļĢāļ°āđāļ āļāļāļĩāđāļĒāļāļāđāļĒāļĩāđāļĒāļĄ āļāļĢāļ°āđāļ āļāļāļ·āđāļāļāļēāļāļāļĢāļāļāļāļĨāļļāļĄāļāļĢāļāļĩāđāļāđāļāļēāļāļŠāđāļ§āļāđāļŦāļāđ
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)
}āļāđāļēāļāļāļēāļ Java āļŦāļĢāļ·āļ Python āļāļĢāļāļāļĩāđ Go āļāļ°āļāļģāļŦāļāļāļāđāļēāđāļĢāļīāđāļĄāļāđāļāđāļŦāđāļāļąāļ§āđāļāļĢāđāļāđāļ "zero value" āđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī: 0 āļŠāļģāļŦāļĢāļąāļāļāļąāļ§āđāļĨāļ, "" āļŠāļģāļŦāļĢāļąāļ string, false āļŠāļģāļŦāļĢāļąāļ bool, nil āļŠāļģāļŦāļĢāļąāļ pointer āđāļĨāļ° slice
āļāļąāļāļāđāļāļąāļāđāļĨāļ°āļāļēāļĢāļāļ·āļāļāđāļēāļŦāļĨāļēāļĒāļāđāļē
Go āļāļāļļāļāļēāļāđāļŦāđāļāļ·āļāļāđāļēāļŦāļĨāļēāļĒāļāđāļēāđāļāđ āļāļķāđāļāđāļāđāļāļāļļāļāļŠāļĄāļāļąāļāļīāļāļĩāđāđāļāđāļāļĒāđāļēāļāļāļ§āđāļēāļāļāļ§āļēāļāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļāļāļīāļāļāļĨāļēāļ
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
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())
}āđāļāđ pointer receiver (*User) āđāļĄāļ·āđāļ method āđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļŠāļāļēāļāļ°āļŦāļĢāļ·āļāđāļĄāļ·āđāļ struct āļĄāļĩāļāļāļēāļāđāļŦāļāđ āđāļāđ value receiver (User) āļŠāļģāļŦāļĢāļąāļ method āļāđāļēāļāļāļĒāđāļēāļāđāļāļĩāļĒāļ§āļāļ struct āļāļĩāđāđāļāļē
Interface: polymorphism āđāļāļ implicit
Interface āđāļ Go āļāļđāļ implement āđāļāļ implicit āļāļĢāļ°āđāļ āļāļŦāļāļķāđāļāļāļ°āđāļāđāļāđāļāļāļēāļĄ interface āļāđāļē implement method āļāļąāđāļāļŦāļĄāļāļāļāļāļĄāļąāļ āđāļāļĒāđāļĄāđāļāđāļāļāļāļĢāļ°āļāļēāļĻāļāļĒāđāļēāļāļāļąāļāđāļāļ
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 āđāļāļāļąāļ§
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 āļāđāļāļāļīāļāļāļĨāļēāļāđāļāđāļāļāđāļēāļāļĩāđāļāļ·āļāļāļĨāļąāļāļāļĒāđāļēāļāļāļąāļāđāļāļ āļāļąāļāļāļąāļāđāļŦāđāļāļąāļāļāļēāļĢāļāļĒāđāļēāļāđāļāđāļĄāļāļ§āļ
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)
}
}āļāļąāđāļāđāļāđ Go 1.13 āđāļāđ errors.Is() āđāļāļ·āđāļāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļāļąāļ sentinel error āđāļĨāļ° errors.As() āđāļāļ·āđāļāļāļķāļāļāļĢāļ°āđāļ āļ error āđāļāļāļēāļ°āļāļēāļāļŠāļēāļĒ error āļāļĩāđāļāļđāļ wrap
Goroutine: concurrency āļāđāļģāļŦāļāļąāļāđāļāļē
Goroutine āđāļāđāļ thread āļāđāļģāļŦāļāļąāļāđāļāļēāļāļĩāđāļāļąāļāļāļēāļĢāđāļāļĒ runtime āļāļāļ Go āļāļēāļĢāđāļĢāļīāđāļĄ goroutine āđāļāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļĩāļĒāļāđāļĄāđāļāļĩāđ KB
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 āļāđāļ§āļĒāđāļŦāđāļĄāļĩāļāļēāļĢāļāļīāļāđāļāļĢāđāļāļāđāļāļĩāđāļāļĨāļāļāļ āļąāļĒāđāļĨāļ°āļāļēāļĢāđāļĨāļāđāļāļĨāļĩāđāļĒāļāļāđāļāļĄāļđāļĨ
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
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 (Communicating Sequential Processes): "āļāļĒāđāļēāļŠāļ·āđāļāļŠāļēāļĢāđāļāļĒāļāļēāļĢāđāļāļĢāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āđāļāđāļāļāđāļāļĢāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļĒāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢ" Channel āļāđāļāļāļāļąāļ race condition
āļāļēāļĢāļāļāļŠāļāļāđāļ Go
Go āļĄāļĩ framework āļāļāļŠāļāļāļāļĩāđāđāļĢāļĩāļĒāļāļāđāļēāļĒāđāļāđāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ āđāļāļĨāđāļāļāļŠāļāļāļĨāļāļāđāļēāļĒāļāđāļ§āļĒ _test.go
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
}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
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: Goroutines āđāļĨāļ° Channels - āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ
āđāļāļĩāđāļĒāļ§āļāļēāļāļāļēāļĢāļāļģāļāļēāļāļāļĢāđāļāļĄāļāļąāļāđāļ Go āļāđāļ§āļĒ goroutines āđāļĨāļ° channels āļĢāļđāļāđāļāļāļāļąāđāļāļŠāļđāļ āļāļēāļĢāļāļīāļāđāļāļĢāđāļāļāđ āļāļģāļŠāļąāđāļ select āđāļĨāļ°āđāļāļ§āļāļēāļāļāļāļīāļāļąāļāļīāļāļĩāđāļāļĩāļāļĩāđāļŠāļļāļāļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāđāļāļĒāļĨāļ°āđāļāļĩāļĒāļ

25 āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Go āļĒāļāļāļāļīāļĒāļĄ: āļāļđāđāļĄāļ·āļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļē
āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Go āļāđāļ§āļĒ 25 āļāļģāļāļēāļĄāļāļĩāđāļāļđāļāļāļēāļĄāļāđāļāļĒ goroutine, channel, interface āđāļĨāļ°āļĢāļđāļāđāļāļāļāļēāļĢāļāļģāļāļēāļāļāļĢāđāļāļĄāļāļąāļāļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ

āļŠāļąāļĄāļ āļēāļĐāļāđāđāļāļāļāļīāļ Go: Goroutine, Channel āđāļĨāļ° Concurrency
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāđāļāļāļāļīāļ Go āđāļāļĩāđāļĒāļ§āļāļąāļ goroutine, channel āđāļĨāļ° concurrency pattern āļāđāļēāļāđ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāđāļāļāļīāļāļāļĨāļēāļāļāļĩāđāļāļāļāđāļāļĒ āđāļĨāļ°āļāļģāļāļāļāļĢāļ°āļāļąāļāļāļđāđāđāļāļĩāđāļĒāļ§āļāļēāļāļŠāļģāļŦāļĢāļąāļāđāļāļĢāļĩāļĒāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāđāļāļāļāļīāļ Go āļāļĩ 2026