1.11 شرط (if, switch)

1.11 شرط (if, switch)

1.11.1 شرط (if-else) #

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

if condition {
   //Do something
} else if condition {
   //Do something
} else {
   //Do something
}

در بالا condition عبارتی است که قرار است وضعیت شرط را مشخص کند و در صورت true شدن شرط بر قرار می‌شود و در صورت برقرار نشدن شرط اول، برنامه وارد else if می‌شود و مجدد یک condition دیگری را چک می‌کند که وضعیتش true می‌شود یا خیر و در نهایت منتهی می‌شود به else.

در شرط ما یک یا چندتا condition می‌توانیم داشته باشیم که این condition‌ ها برای تعیین وضعیت از یکسری عملگرها نظیر && , || , > , < , <= , => , ! و … استفاده می کنند.

زبان گو از فرمت‌های زیر برای ایجاد شرط استفاده می‌کند:

  • فقط if
  • if-else تو در تو (nested)
  • شرط کوتاه با if

1.11.2 کلمه if به تنهایی #

شما می‌توانید به تنهایی از if استفاده و یک condition را بررسی کنید:

if condition {
   //Do something
}

برای نمونه کد زیر را ببینید:

package main

import "fmt"

func main() {
    a := 6
    if a > 5 {
        fmt.Println("a is greater than 5")
    }
}

در مثال بالا ما مقدار a را با عدد ۵ مقایسه کردیم، شرط ما به این صورت بود که آیا a از ۵ بزرگتر است یا خیر؟ جواب true است. a بزرگتر از 5 است و شرط برقرار میشود.

در مثال زیر ما چند condition را داخل یک شرط بررسی کردیم. آیا a بزرگتر از 3 و a کوچک تر از 6 است؟

package main

import "fmt"

func main() {
    a := 4
    if a > 3 && a < 6 {
        fmt.Println("a is within range")
    }
}

1.11.3 کلمه else #

فرمت شرط همراه با else مانند مثال زیر است:

if condition {
   //Do something
} else {
   //Do something
}

در مثال بالا اگر condition برقرار نشود، کدهای داخل else اجرا خواهند شد. به مثال زیر توجه کنید:

package main

import "fmt"

func main() {
    a := 1
    b := 2

    if a > b {
        fmt.Println("a is greater than b")
    } else {
        fmt.Println("b is greater than a")
    }
}

1.11.4 ادامه شرط با else if #

شما با استفاده از کلید واژه else if دقیقا به همین فرمت که اینجا نوشته شده می‌توانید condition دیگری را بررسی کرده و در صورت برقرار شدن شرط، عملیات را انجام دهید.

if condition1 {
   //Do something
} else if condition2 {
   //Do something
} else {
  //Do something
}

به مثال زیر توجه کنید:

package main

import "fmt"

func main() {
    age := 29
    if age < 18 {
        fmt.Println("Kid")
    } else if age >= 18 && age < 40 {
        fmt.Println("Young")
    } else {
        fmt.Println("Old")
    }
}

1.11.5 شرط تو در تو (nested) #

در زبان گولنگ شما می‌توانید شرط‌های تو در تو (nested) داشته باشید (برای توسعه بهتر پروژه، بهتر است کمتر از شرطهای تو در تو استفاده کنید، زیرا این گونه شرط نویسی خوانایی کد را پایین می‌آورد)

if condition {
  //Do something
  if condition2 {
    //Do something
  }
  //Do something
}

در مثال زیر یک نمونه شرط تو در تو به همراه else قرار دادیم:

if condition1 {
   //...
} else {
   //...
   if condition2 {
      //...
   } else {
     //....
   }
   //....
}

در کد زیر مثالی برای شروط تو در تو زدیم:

package main

import "fmt"

func main() {
	a := 1
	b := 2
	c := 3

	if a > b {
		if a > c {
			fmt.Println("Biggest is a")
		} else {
			fmt.Println("Biggest is c")
		}
	} else {
		if b > c {
			fmt.Println("Biggest is b")
		} else {
			fmt.Println("Biggest is c")
		}
	}
}

1.11.6 تعریف شرط و قرار دادن condition در متغیر کوتاه #

در زبان گو شرط‌ها, امکان تعریف متغیر به روش کوتاه در شرط برای condition را دارند و شما می‌توانید قبل از بررسی کردن condition اون رو در همان خط مقدار دهی کنید.

if statement; condition {
   //Do something
}

به مثال زیر توجه کنید:

package main

import "fmt"

func main() {
    if a := 6; a > 5 {
        fmt.Println("a is greater than 5")
    }
}

در مثال بالا ما یک متغیر کوتاه با نام a را داخل شرط تعریف کردیم و مقدار 6 را بهش دادیم، سپس با قرار دادن ; semi-colon برقراری وضعیت شرط را بررسی کردیم.

1.11.7 Switch #

زبان گو ‌مانند برخی از زبان‌ها از switch پشتیبانی می‌کند. switch یک روش بسیار ساده‌تر و همچنین روشی برای جلوگیری از else if های مکرر در شرط است.

switch statement; expression {
case expression1:
     //Dosomething
case expression2:
     //Dosomething
default:
     //Dosomething
}

زمانیکه switch رو تعریف می‌کنیم, هم می‌توانیم مقداری که قبلا تعریف کردیم رو برای بررسی بهش بدیم و هم می‌توانیم از روش (تعریف متغیر به روش کوتاه) یک مقدار جدید تعریف کنیم و ازش استفاده کنیم. بعد از کلمه switch باید یک مقدار رو بهش بدیم و داخل switch با استفاده از case بررسی کنیم که مقداری که داده شده با اون چیزی که مد نظر ما هست برابر هست یا خیر. اگر هیج کدام از شرط ها برقرار نبود، کد های بعد از default اجرا میشن. استفاده از شرط default اجباری نیست.

package main

import "fmt"

func main() {
    switch ch := "b"; ch {
    case "a":
        fmt.Println("a")
    case "b", "c":
        fmt.Println("b or c")
    default:
        fmt.Println("No matching character")
    }
}

در مثال بالا ما یک متغیر با نام ch رو به روش تعریف متغیر به روش کوتاه مقدار دهی کردم و همون متغیر را برای بررسی به switch دادیم. سپس با استفاده از کلید واژه case بررسی کردیم که آیا ch برابر است با اون مقادیری که ما تعریف کردیم یا خیر. اگر برابر بود کدهای درون اون case اجرا خواهند شد و اگر برابر نبود ما با استفاده از کلید واژه default مقدار پیش‌فرضی را در خروجی چاپ می‌کنیم.

1.11.8 fallthrough #

اگر در آخر یک case از این keyword استفاده شود، case بعدی بدون هیچ شرطی اجرا می‌شود. نکته ای که حتی بسیاری از منابع انگلیسی هم به صورت واضح اشاره نکرده اند، این است وقتی از fallthrough استفاده می کنیم، کیس بعد از آن بدون بررسی اجرا می شود حتی اگر شرطش برقرار نباشد. در ادامه اول یک مثال صحیح از استفاده ی fallthrough و سپس یک مثال اشتباه می زنیم.

package main

import "fmt"

func main() {
	var dayOfWeek int

	fmt.Printf("Enter a day of week: ")
	fmt.Scanln(&dayOfWeek)

	switch dayOfWeek {
	case 1:
		fmt.Println("Monday")
		fallthrough
	case 2:
		fmt.Println("Tuesday")
		fallthrough
	case 3:
		fmt.Println("Wednesday")
		fallthrough
	case 4:
		fmt.Println("Thursday")
		fallthrough
	case 5:
		fmt.Println("Friday")
		fallthrough
	case 6:
		fmt.Println("Saturday")
		fallthrough
	case 7:
		fmt.Println("Sunday")
	default:
		fmt.Println("Invalid Day")
	}
}

در این مثال از کاربر یک روز هفته را می گیریم، سپس اسم آن روز به علاوه ی اسم تعداد روز های باقی مانده از هفته را چاپ می کنیم. با استفاده از fallthrough به سادگی می توان اینکار را انجام داد.

خروجی کد ما اگر روز سوم هفته را وارد کنیم به این صورت است:

Enter a day of week: 3
Wednesday
Thursday
Friday
Saturday
Sunday

اما اگر از fallthrough به‌صورت اشتباه استفاده کنیم، کد ما ازنظر منطقی با مشکل مواجه می شود. به مثال زیر دقت کنید:

package main

import (
	"fmt"
	"strings"
)

func main() {
	var notificationType string = "sms,email"

	switch {
	case strings.Contains(notificationType, "sms"):
		fmt.Println("Sent sms")
		fallthrough
	case strings.Contains(notificationType, "email"):
		fmt.Println("Sent email")
		fallthrough
	case strings.Contains(notificationType, "push"):
		fmt.Println("Sent push")
	default:
		fmt.Println("Unknown")
	}
}

در این مثال، برنامه نویس اینگونه در نظر گرفته است که fallthrough روشی است تا بتواند در صورت درست بودن یک شرط، سراغ شرط بعدی برود و آن را هم چک کند. اما fallthrough بدون اینکه شرط کیس بعدی را چک کند. آن را اجرا می کند. در این مثال با اینکه مشخص کردیم فقط sms و email شود، push هم می کند.

Sent sms
Sent email
Sent push

1.11.9 Switch خودآزمون #

تفاوت ساختار و خروجی چهار فرمت مشابه زیر را بررسی کنید:

switch f(); {
case true:
  println(1)
case false:
  println(0)
}
switch f()
{
case true:
  println(1)
case false:
  println(0)
}
switch f() {
case true:
  println(1)
case false:
  println(0)
}
switch f(); true {
case true:
  println(1)
case false:
  println(0)
}
کدها در زمان اجرا یا پیش از آن، در برخی IDE یا Code Editor(ها) فرمت می‌شوند. هدف این خودآزمون دقت به ساختار ابزار switch است.