ساختارهای کنترلی در گولنگ - آموزش if، for و switch در Go
2025/11/24ساختارهای کنترلی تعیین میکنند که کد شما چگونه اجرا شود. در این مقاله، تمام ساختارهای کنترلی 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 4for به عنوان 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 4continue - رفتن به تکرار بعدی
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 |
رفتن به تکرار بعدی |