آموزش مقدماتی زبان go | حلقه‌ها و عبارات حلقه‌ای

حلقه for در Go

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

ساده‌ترین شکل حلقه for در Go به این صورت است:

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

در این مثال، سه بخش مهم داخل حلقه دیده می‌شود:

بخش اول i := 0 مقدار اولیه متغیر شمارنده را تعیین می‌کند. این متغیر فقط داخل خود حلقه قابل استفاده است.

بخش دوم i < 5 شرط ادامه حلقه است. تا زمانی که این شرط درست (true) باشد، بدنه حلقه اجرا می‌شود. به محض اینکه شرط نادرست (false) شود، حلقه متوقف می‌شود.

بخش سوم i++ عملیاتی است که در پایان هر دور از حلقه اجرا می‌شود. در اینجا مقدار متغیر i یک واحد افزایش پیدا می‌کند.

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

یکی از ویژگی‌های مهم حلقه for در Go این است که می‌توان بخش‌های مختلف آن را حذف کرد. برای مثال، اگر بخش اول (مقدار اولیه) را حذف کنیم، باید متغیر شمارنده را قبل از حلقه تعریف کرده باشیم:

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

اگر بخش سوم (عملیات افزایش) را حذف کنیم، باید آن را داخل بدنه حلقه بنویسیم:

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

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

for {
    fmt.Println("این خط تکرار می‌شود")
}

نکته مهم: حلقه بی‌نهایت در برنامه‌های واقعی معمولاً باید با دستور break متوقف شود، وگرنه برنامه هرگز پایان نمی‌یابد و ممکن است باعث قفل شدن سیستم شود.

شکل دیگری از حلقه for در Go وجود دارد که به آن "حلقه با بازه" یا for range می‌گویند. این نوع حلقه برای پیمایش روی عناصر یک ساختار داده مثل آرایه، بردار (slice)، رشته یا map استفاده می‌شود:

numbers := []int{10, 20, 30, 40}
for index, value := range numbers {
    fmt.Println("ایندکس:", index, "مقدار:", value)
}

در این مثال، range روی بردار numbers حرکت می‌کند و در هر دور، ایندکس (موقعیت) و مقدار عنصر جاری را در متغیرهای index و value قرار می‌دهد. اگر فقط به مقدار نیاز داشتیم و ایندکس مهم نبود، می‌توانیم از علامت زیرخط (underscore) استفاده کنیم:

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

علامت _ در Go به معنای "این مقدار را نمی‌خواهم" است. این کار باعث می‌شود که کامپایلر خطای "متغیر تعریف شده اما استفاده نشده" ندهد.

برای رشته‌ها هم می‌توان از for range استفاده کرد. در این حالت، هر دور از حلقه یک کاراکتر را برمی‌گرداند. اما نکته مهم این است که ایندکس بازگشتی بر اساس بایت (byte) است، نه کاراکتر. چون در Go رشته‌ها بر اساس UTF-8 ذخیره می‌شوند و هر کاراکتر ممکن است چند بایت اشغال کند:

text := "سلام"
for index, char := range text {
    fmt.Printf("ایندکس: %d، کاراکتر: %c\n", index, char)
}

در مثال بالا، چون حروف فارسی هرکدام دو بایت اشغال می‌کنند، ایندکس‌ها به صورت 0، 2، 4، 6 نمایش داده می‌شوند.

در نهایت، می‌توان از حلقه for به صورت تودرتو (داخل هم) هم استفاده کرد. یعنی یک حلقه for درون حلقه for دیگر قرار بگیرد. این کار برای کار با ساختارهای داده چندبعدی مثل ماتریس‌ها بسیار رایج است:

for i := 1; i <= 3; i++ {
    for j := 1; j <= 3; j++ {
        fmt.Print(i*j, " ")
    }
    fmt.Println()
}

این برنامه یک جدول ضرب ساده سه در سه را چاپ می‌کند. در هر دور از حلقه بیرونی، حلقه درونی به طور کامل اجرا می‌شود.

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

پرسش و پاسخ این درس

برای ثبت پرسش ابتدا در سایت وارد شوید.

  • 1
  • 2
  • 3