1.11 شرط (if, switch)

1.11 شرط (if, switch)

1.11.1 شرط (if-else) #

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

1if condition {
2   //Do something
3} else if condition {
4   //Do something
5} else {
6   //Do something
7}

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

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

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

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

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

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

1if condition {
2   //Do something
3}

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6    a := 6
 7    if a > 5 {
 8        fmt.Println("a is greater than 5")
 9    }
10}
1$ go run main.go
2a is greater than 5

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

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6    a := 4
 7    if a > 3 && a < 6 {
 8        fmt.Println("a is within range")
 9    }
10}
1$ go run main.go
2a is within range

1.11.3 کلمه else #

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

1if condition {
2   //Do something
3} else {
4   //Do something
5}

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6    a := 1
 7    b := 2
 8
 9    if a > b {
10        fmt.Println("a is greater than b")
11    } else {
12        fmt.Println("b is greater than a")
13    }
14}
1$ go run main.go
2b is greater than a

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

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

1if condition1 {
2   //Do something
3} else if condition2 {
4   //Do something
5} else {
6  //Do something
7}

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6    age := 29
 7    if age < 18 {
 8        fmt.Println("Kid")
 9    } else if age >= 18 && age < 40 {
10        fmt.Println("Young")
11    } else {
12        fmt.Println("Old")
13    }
14}
1$ go run main.go
2Young

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

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

1if condition {
2  //Do something
3  if condition2 { 
4    //Do something
5  }
6  //Do something
7}

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

 1if condition1 {
 2   //...
 3} else {
 4   //...
 5   if condition2 {
 6      //...
 7   } else {
 8     //....
 9   }
10   //....
11}

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6    a := 1
 7    b := 2
 8    c := 3
 9
10    if a > b && a > c {
11        fmt.Println("Biggest is a")
12    } else if b > a && b > c {
13        fmt.Println("Biggest is b")
14    } else {
15        fmt.Println("Biggest is c")
16    }
17}
1$ go run main.go
2Biggest is c

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

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

1if statement; condition {
2   //Do something
3}

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

1package main
2
3import "fmt"
4
5func main() {
6    if a := 6; a > 5 {
7        fmt.Println("a is greater than 5")
8    }
9}
1$ go run main.go
2a is greater than 5

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

1.11.7 Switch #

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

1switch statement; expression {
2case expression1:
3     //Dosomething
4case expression2:
5     //Dosomething
6default:
7     //Dosomething
8}

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6    switch ch := "b"; ch {
 7    case "a":
 8        fmt.Println("a")
 9    case "b", "c":
10        fmt.Println("b or c")    
11    default:
12        fmt.Println("No matching character")    
13    }
14}  
1$ go run main.go
2b or c

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

1.11.8 fallthrough #

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

 1package main
 2
 3import "fmt"
 4
 5func main() {
 6	var dayOfWeek int
 7
 8	fmt.Printf("Enter a day of week: ")
 9	fmt.Scanln(&dayOfWeek)
10
11	switch dayOfWeek {
12	case 1:
13		fmt.Println("Monday")
14		fallthrough
15	case 2:
16		fmt.Println("Tuesday")
17		fallthrough
18	case 3:
19		fmt.Println("Wednesday")
20		fallthrough
21	case 4:
22		fmt.Println("Thursday")
23		fallthrough
24	case 5:
25		fmt.Println("Friday")
26		fallthrough
27	case 6:
28		fmt.Println("Saturday")
29		fallthrough
30	case 7:
31		fmt.Println("Sunday")
32	default:
33		fmt.Println("Invalid Day")
34	}
35}

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

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

1Enter a day of week: 3
2Wednesday
3Thursday
4Friday
5Saturday
6Sunday

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

 1package main
 2
 3import (
 4	"fmt"
 5	"strings"
 6)
 7
 8func main() {
 9	var notificationType string = "sms,email"
10
11	switch {
12	case strings.Contains(notificationType, "sms"):
13		fmt.Println("Sent sms")
14		fallthrough
15	case strings.Contains(notificationType, "email"):
16		fmt.Println("Sent email")
17		fallthrough
18	case strings.Contains(notificationType, "push"):
19		fmt.Println("Sent push")
20	default:
21		fmt.Println("Unknown")
22	}
23}

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

1Sent sms
2Sent email
3Sent push

1.11.9 Switch خودآزمون #

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

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