1. مرور کلی بر اظهارات حلقه

در زبان Go، اظهارات حلقه به ما اجازه می‌دهند که یک بلوک کد را چندین بار اجرا کنیم. وقتی نیاز به انجام مکرر عملیات‌های خاص دارید، اظهارات حلقه بسیار مفید می‌شوند. به عنوان مثال ممکن است بخواهید از روی هر عنصر در یک آرایه بگذرید یا یک عملیات را تا رسیدن به یک شرط خاص تکرار کنید. در Go، اظهارات حلقه اصلی به کمک کلمه کلیدی for پیاده‌سازی می‌شوند که تنها اظهارات حلقه در زبان Go هستند. استفاده صحیح از اظهارات حلقه برای نوشتن کدی کارآمد و قابل نگهداری بسیار حیاتی است.

2. مبانی حلقه for

2.1 ساختار حلقه for

حلقه for در زبان Go از سه بخش تشکیل شده است:

  1. اظهارات مقدماتی: قبل از اولین تکرار اجرا می‌شود و معمولاً برای اعلام یک شمارنده حلقه استفاده می‌شود.
  2. عبارت شرطی: قبل از هر تکرار ارزیابی می‌شود. اگر شرط true باشد، بدنه حلقه اجرا می‌شود.
  3. اظهارات پس از: بعد از بلوک کد هر تکرار اجرا می‌شود و معمولاً برای بروزرسانی شمارنده حلقه استفاده می‌شود.

دستور for به صورت زیر است:

for اظهارات مقدماتی; عبارت شرطی; اظهارات پس از {
    // کد بدنه حلقه
}

2.2 مثال ساده حلقه for

بیایید از طریق مثال ساده‌ای فرآیند اجرای حلقه for را درک کنیم:

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("مقدار i:", i)
    }
}

در این مثال، متغیر i به مقدار 0 مقدماتی‌سازی می‌شود. حلقه for شرط i < 5 را بررسی می‌کند. اگر شرط درست باشد، بدنه حلقه اجرا می‌شود و مقدار i چاپ می‌شود. بعد از اجرای بدنه حلقه، مقدار i توسط i++ (عملیات افزایش) بروزرسانی می‌شود و سپس حلقه شرط را مجدداً بررسی می‌کند تا مقدار i به 5 برسد که در آن زمان شرط غلط می‌شود و حلقه for پایان می‌یابد.

2.3 سایر مثال‌های حلقه for

2.3.1 حلقه بی‌پایان

در Go، می‌توانید اظهارات مقدماتی، عبارت شرطی و اظهارات پس از حلقه for را حذف کنید تا یک حلقه بی‌پایان ایجاد کنید که تا زمانی که توسط یک بیانیه break یا مقدار بازگشتی از یک تابع متوقف شود، ادامه خواهد یافت.

for {
    // کد درون یک حلقه بی‌پایان
    if شرطی_خاص {
        break // خروج از حلقه زمانی که یک شرط خاص برآورده شود
    }
}

2.3.2 حلقه فقط با شرط

در Go، می‌توانید از یک حلقه for با شرطی تنها استفاده کنید که مشابه یک حلقه while در زبان‌های برنامه‌نویسی دیگر است.

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

کد فوق 0 تا 4 را چاپ می‌کند و حلقه زمانی که n به 5 برسد خاتمه می‌یابد.

2.3.3 گذر از یک آرایه یا برش با حلقه

در Go، کلمه کلیدی range برای ساده‌تر کردن گذر از هر عنصر یک آرایه یا برش استفاده می‌شود.

items := []int{1, 2, 3, 4, 5}
for index, value := range items {
    fmt.Printf("اندیس: %d, مقدار: %d\n", index, value)
}

کد فوق اندیس و مقدار هر عنصر را چاپ می‌کند. اگر فقط از مقدار عناصر نیاز دارید، می‌توانید از _ برای نادیده‌گرفتن اندیس استفاده کنید.

for _, value := range items {
    fmt.Printf("مقدار: %d\n", value)
}

توجه: استفاده از آرایه‌ها در فصول بعدی به تفصیل توضیح داده خواهد شد. اگر این بخش را درک نکردید اشکالی ندارد تا زمانی که بفهمید که حلقه for می‌تواند به این شکل استفاده شود.

2.3.4 حلقه زدن از طریق نقشه‌ها

در هنگام گردش در یک نقشه، ترکیب حلقه for و عبارت range بسیار قدرتمند است. این به شما امکان می‌دهد تا هر جفت کلید-مقدار نقشه را بگیرید.

colors := map[string]string{"red": "#ff000", "green": "#00ff00", "blue": "#000ff"}
for key, value := range colors {
    fmt.Printf("کلید: %s، مقدار: %s\n", key, value)
}

در این مثال، تمام کلیدها و مقادیر متناظر آنها در نقشه colors را چاپ می‌کنیم. مشابه حلقه زدن از آرایه‌ها، اگر فقط به کلید یا مقدار نیاز دارید، می‌توانید از نادیده گرفتن دیگری انتخاب کنید.

توجه: استفاده از نقشه‌ها در فصول بعدی به طور دقیق توضیح داده خواهد شد. اگر این بخش را درک نمی‌کنید، این مشکل نیست تا جایی که می‌فهمید که حلقه for می‌تواند به این صورت استفاده شود.

3 کنترل جریان حلقه‌ها

3.1 استفاده از break برای پایان دادن به یک حلقه

گاهی اوقات نیاز است که هنگام برقرار شدن یک شرط خاص، به صورت زودهنگام از حلقه خارج شویم، و در چنین مواردی، می‌توان از دستور break استفاده کرد. در زیر یک مثال از استفاده از break برای خروج از یک حلقه آمده است:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // زمانی که i برابر 5 باشد، حلقه را خروجی می‌دهیم
        }
        fmt.Println("مقدار i:", i)
    }
    // خروجی فقط شامل مقادیر از 0 تا 4 خواهد بود
}

3.2 استفاده از continue برای رد کردن ایتریشن‌ها

در مواقع خاصی، ممکن است بخواهیم ایتریشن فعلی را رد کرده و با ایتریشن بعدی ادامه دهیم. این کار را می‌توان با استفاده از دستور continue انجام داد. در ادامه یک مثال آورده شده است:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i%2 != 0 {
            continue // اگر i فرد باشد، این ایتریشن را رد کن
        }
        fmt.Println("عدد زوج:", i)
    }
}