GoCasts آموزش Go به زبان ساده

بیش از ۱۰۰۰ شرکت‌کننده یادگیری Go و Backend رو از امروز شروع کن
ثبت‌نام دوره + تیم‌سازی

ساختارهای کنترلی در گولنگ - آموزش if، for و switch در Go

ساختارهای کنترلی تعیین می‌کنند که کد شما چگونه اجرا شود. در این مقاله، تمام ساختارهای کنترلی Go را با مثال‌های عملی بررسی می‌کنیم.

دستور if

if ساده

package main

import "fmt"

func main() {
    age := 18

    if age >= 18 {
        fmt.Println("بزرگسال هستید")
    }
}

if-else

age := 16

if age >= 18 {
    fmt.Println("بزرگسال")
} else {
    fmt.Println("نوجوان")
}

if-else if-else

score := 85

if score >= 90 {
    fmt.Println("عالی - A")
} else if score >= 80 {
    fmt.Println("خوب - B")
} else if score >= 70 {
    fmt.Println("متوسط - C")
} else if score >= 60 {
    fmt.Println("قبول - D")
} else {
    fmt.Println("مردود - F")
}

if با تعریف متغیر

یکی از ویژگی‌های خاص Go - تعریف متغیر در شرط:

// متغیر x فقط در scope این if معتبر است
if x := computeValue(); x > 10 {
    fmt.Println("x بزرگتر از 10 است:", x)
} else {
    fmt.Println("x کوچکتر یا مساوی 10 است:", x)
}

// x در اینجا در دسترس نیست
// fmt.Println(x)  // خطا!

مثال عملی: بررسی خطا

package main

import (
    "fmt"
    "os"
)

func main() {
    if file, err := os.Open("config.txt"); err != nil {
        fmt.Println("خطا در باز کردن فایل:", err)
    } else {
        defer file.Close()
        fmt.Println("فایل با موفقیت باز شد")
        // کار با فایل...
    }
}

حلقه for

Go فقط یک نوع حلقه دارد: for. اما این حلقه می‌تواند مانند while و do-while هم عمل کند.

for کلاسیک (سه بخشی)

// for init; condition; post { }
for i := 0; i < 5; i++ {
    fmt.Println(i)
}
// خروجی: 0 1 2 3 4

for به عنوان while

i := 0
for i < 5 {
    fmt.Println(i)
    i++
}

حلقه بی‌نهایت

for {
    fmt.Println("برای همیشه...")
    // برای خروج از break استفاده کنید
}

for با range

برای پیمایش روی آرایه‌ها، slice‌ها، map‌ها و رشته‌ها:

package main

import "fmt"

func main() {
    // پیمایش slice
    numbers := []int{10, 20, 30, 40, 50}

    // با ایندکس و مقدار
    for index, value := range numbers {
        fmt.Printf("index: %d, value: %d\n", index, value)
    }

    // فقط مقدار
    for _, value := range numbers {
        fmt.Println(value)
    }

    // فقط ایندکس
    for index := range numbers {
        fmt.Println(index)
    }
}

پیمایش map

ages := map[string]int{
    "علی":  25,
    "رضا":  30,
    "مریم": 28,
}

for name, age := range ages {
    fmt.Printf("%s: %d سال\n", name, age)
}

پیمایش رشته (Unicode)

text := "سلام Go"

// پیمایش بر اساس rune (کاراکتر Unicode)
for index, char := range text {
    fmt.Printf("index: %d, char: %c, code: %d\n", index, char, char)
}

پیمایش channel

ch := make(chan int)

go func() {
    for i := 1; i <= 5; i++ {
        ch <- i
    }
    close(ch)
}()

for value := range ch {
    fmt.Println(value)
}

break و continue

break - خروج از حلقه

for i := 0; i < 10; i++ {
    if i == 5 {
        break  // خروج از حلقه
    }
    fmt.Println(i)
}
// خروجی: 0 1 2 3 4

continue - رفتن به تکرار بعدی

for i := 0; i < 10; i++ {
    if i%2 == 0 {
        continue  // رد شدن از اعداد زوج
    }
    fmt.Println(i)
}
// خروجی: 1 3 5 7 9

برچسب‌ها (Labels)

برای خروج از حلقه‌های تودرتو:

outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i == 1 && j == 1 {
            break outer  // خروج از هر دو حلقه
        }
        fmt.Printf("i=%d, j=%d\n", i, j)
    }
}

دستور switch

switch ساده

day := 3

switch day {
case 1:
    fmt.Println("شنبه")
case 2:
    fmt.Println("یکشنبه")
case 3:
    fmt.Println("دوشنبه")
case 4:
    fmt.Println("سه‌شنبه")
case 5:
    fmt.Println("چهارشنبه")
case 6:
    fmt.Println("پنجشنبه")
case 7:
    fmt.Println("جمعه")
default:
    fmt.Println("روز نامعتبر")
}

چند مقدار در یک case

day := "شنبه"

switch day {
case "شنبه", "یکشنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه":
    fmt.Println("روز کاری")
case "پنجشنبه", "جمعه":
    fmt.Println("آخر هفته")
default:
    fmt.Println("نامعتبر")
}

switch بدون عبارت (مثل if-else)

score := 85

switch {
case score >= 90:
    fmt.Println("عالی")
case score >= 80:
    fmt.Println("خوب")
case score >= 70:
    fmt.Println("متوسط")
default:
    fmt.Println("نیاز به تلاش بیشتر")
}

switch با تعریف متغیر

switch os := runtime.GOOS; os {
case "darwin":
    fmt.Println("macOS")
case "linux":
    fmt.Println("Linux")
case "windows":
    fmt.Println("Windows")
default:
    fmt.Println("سیستم‌عامل:", os)
}

fallthrough

در Go برخلاف C، case‌ها به صورت خودکار break دارند. برای ادامه به case بعدی از fallthrough استفاده کنید:

num := 2

switch num {
case 1:
    fmt.Println("یک")
    fallthrough
case 2:
    fmt.Println("دو")
    fallthrough
case 3:
    fmt.Println("سه")
}
// خروجی: دو سه

Type Switch

برای بررسی نوع متغیر interface:

func checkType(x interface{}) {
    switch v := x.(type) {
    case int:
        fmt.Printf("عدد صحیح: %d\n", v)
    case string:
        fmt.Printf("رشته: %s\n", v)
    case bool:
        fmt.Printf("بولین: %t\n", v)
    case []int:
        fmt.Printf("slice از int: %v\n", v)
    default:
        fmt.Printf("نوع ناشناخته: %T\n", v)
    }
}

func main() {
    checkType(42)
    checkType("سلام")
    checkType(true)
    checkType([]int{1, 2, 3})
}

دستور goto

توجه: استفاده از goto توصیه نمی‌شود. فقط در موارد خاص استفاده کنید.

func main() {
    i := 0

loop:
    if i < 5 {
        fmt.Println(i)
        i++
        goto loop
    }
}

مثال‌های کاربردی

جستجو در آرایه

func findIndex(arr []int, target int) int {
    for i, v := range arr {
        if v == target {
            return i
        }
    }
    return -1
}

func main() {
    numbers := []int{10, 20, 30, 40, 50}
    index := findIndex(numbers, 30)
    fmt.Println("ایندکس:", index)  // 2
}

شمارش کاراکترها

func countChars(s string) map[rune]int {
    counts := make(map[rune]int)
    for _, char := range s {
        counts[char]++
    }
    return counts
}

func main() {
    text := "سلام سلام"
    counts := countChars(text)
    for char, count := range counts {
        fmt.Printf("%c: %d\n", char, count)
    }
}

FizzBuzz

func fizzBuzz(n int) {
    for i := 1; i <= n; i++ {
        switch {
        case i%15 == 0:
            fmt.Println("FizzBuzz")
        case i%3 == 0:
            fmt.Println("Fizz")
        case i%5 == 0:
            fmt.Println("Buzz")
        default:
            fmt.Println(i)
        }
    }
}

جدول خلاصه

ساختار سینتکس کاربرد
if if cond { } شرط ساده
if-else if cond { } else { } شرط با حالت جایگزین
for for i := 0; i < n; i++ { } حلقه کلاسیک
for (while) for cond { } حلقه شرطی
for (infinite) for { } حلقه بی‌نهایت
for range for i, v := range slice { } پیمایش
switch switch x { case 1: } چند شرط
break break خروج از حلقه
continue continue رفتن به تکرار بعدی

قدم‌های بعدی

منابع

بیش از ۱۰۰۰ شرکت‌کننده یادگیری Go و Backend رو از امروز شروع کن
ثبت‌نام دوره + تیم‌سازی