Control structure กับ Go
Control Structure คืออะไร ?
Control structure ในทาง programming หมายถึงการจัดการ flow ภายใน ชุดคำสั่งของ programming ซึ่งหมายถึงการจัดการลำดับ / เงื่อนไข และการทำซ้ำภายในภาษา programming เพื่อให้ทำงานออกมาลำดับได้ถูกต้อง
ซึ่งปกติจะประกอบด้วยของ 3 อย่างใหญ่ๆ คือ
- Sequential = ลำดับของ programming ซึ่งจะเป็นลำดับการทำงานตั้งแต่บนลงล่างมา
- Selection (หรือ Condition) = การสร้างทางเลือกจากเงือนไขที่กำหนด ซึ่งจะประกอบไปด้วย if, if-else, switch
- Iteration (หรือ Loop) = การสร้าง block สำหรับการทำคำสั่งซ้ำตามเงื่อนไขที่กำหนด ซึ่งปกติจะประกอบไปด้วย for while, do-while
เป้าหมายของการทำ Control structures เพื่อให้สามารถสร้างเงื่อนไขที่ถูกต้องและลำดับที่ถูกต้องในการจัดการคำสั่ง programming ออกมา
Condition
ในภาษา go สามารถสร้างเงื่อนไขได้ด้วย 2 วิธีใหญ่ๆคือ
- ใช้ IF ELSE
- ใช้ SWITCH
โดยภายใน condition นั้นจะต้องระบุ statement เพื่อทำการระบุเงื่อนไขที่ต้องการตรวจสอบขึ้นมา
เรามารู้จักพื้นฐานของการสร้างเงื่อนไขก่อน
condition statement
condition statement คือ statement ทาง programming ที่จะเป็นการระบุเงื่อนไข โดยผลลัพธ์ของ statement นั้นจะคืนค่ากลับมาเป็น true (จริง) หรือ false (เท็จ) ตามเงื่อนไขที่เราระบุ
โดยปกติ statement จะมี 2 แบบใหญ่ๆคือ
- Comparison statement คือ statement ประเภทเปรียบเทียบ
- โดยปกติ จะประกอบไปด้วย
==
(เท่ากับ),!=
(ไม่เท่ากับ),<
(น้อยกว่า),<=
(น้อยกว่าหรือเท่ากับ),>
(มากกว่า),>=
(มากกว่าหรือเท่ากับ)
ตัวอย่างการใช้ Comparison statement
- ตรวจสอบว่าตัวแปร number ที่เป็น integer มีเท่ากับเลข 1 หรือไม่ ?
number == 1 // โดยผลลัพธ์จะคืนเป็น true ถ้า number มีค่าเท่ากับ 1 และเป้น false เมื่อ number มีค่าไม่เท่ากับ 1
- ตรวจสอบว่าตัวแปร fullname มีค่าไม่เท่ากับ mikelopster หรือไม่ ?
fullname != "mikelopster"
- ตรวจสอบว่าตัวแปร newNumber มีค่ามากกว่าตัวแปร currentNumber
newNumber > currentNumber
เป็นต้น (เดี๋ยวตัวนี้เราจะเรียนรู้ไปพร้อมๆกับการใช้งาน condition statement อีกที)
- Logical statement คือ statement ที่ทำการเชื่อมเงื่อนไขของ condition อื่นๆเข้ากันไว้
- โดยปกติ จะประกอบไปด้วย && (และ), || (หรือ), ! (ไม่ / นิเสธ)
- เงื่อนไขของการใช้ของ Logical statement จะเป็นไปตามพื้นฐานของตรรกศาสตร์คือ
- && (และ) จะเป็นจริง เมื่อ statement ทั้ง 2 ตัว (ที่อยู่ซ้ายและขวาของ &&) เป็นจริง
- || (หรือ) จะเป็นจริง เมื่อ statement ทั้ง 2 ตัว (ที่อยู่ซ้ายและขวาของ ||) ตัวใดตัวหนึ่งเป็นจริง
- ! (นิเสธ) จะเป็นจริง เมื่อกลับ condition statement นั้นแล้วส่งผลทำให้เป็นจริง
ตัวอย่างการใช้ Logical statement
- ตรวจสอบว่าตัวแปร number มีค่ามากกว่าหรือเท่ากับ 10 และมีค่าน้อยกว่าหรือเท่ากับ 20 (อยู่ระหว่่าง 10 - 20)
(number >= 10) && (number <= 20)
- ตรวจสอบว่าตัวแปร fullname ชื่อ "mikelopster" หรือ "mikelobster"
(fullname >= "mikelopster") && (fullname <= "mikelobster")
เป็นต้น
เดี๋ยวเราจะลองมาประยุกต์การใช้ Condition statement ร่วมกับ if / else / switch กัน
การใช้ IF ELSE
การใช้เงื่อนไข IF ELSE จะแบ่งออกเป็น 2 แบบใหญ่ๆคือ
- การใช้ if else ปกติ (เงื่อนไขแค่เงื่อนไขเดียว)
- การใช้ if else if (เงื่อนไขมากกว่า 1 เงื่อนไข)
โดยวิธีการใช้งานคือ
// แบบที่ 1
if <condition statement> {
// เมื่อเป็นจริงจะทำตรงนี้
} else {
// เมื่อเป็นเท็จจะทำตรงนี้
}
// แบบที่ 2
if <condition statement> {
// เมื่อเป็นจริงจะทำตรงนี้
} else if <condition statement อันที่ 2> {
// เมื่อ condition statement อันบนเป็นเทจ และ condition statement อันนี้เป็นจริงจะทำตรงนี้
} else {
// เมื่อไม่มี condition statement ไหนเป็นจริงเลย = จะมาทำตรงนี้
}
ตัวอย่างการใช้งาน ตัวอย่างที่ 1:
- ส มมุติมีตัวแปรตัวหนึ่งชื่อ score เป็น integer เก็บคะแนนของนักเรียน
- โดยเงื่อนไขคือ ถ้าคะแนนมากกว่าหรือเท่ากับ 70 คือสอบผ่าน = ให้แสดงคำว่า PASSED ออกมา
- แต่ถ้าคะแนนน้อยกว่า 70 คือสอบตก = ให้แสดงคำว่า FAILED ออกมา
package main
import "fmt"
func main() {
var score int = 62 // ตัวอย่างสมมุติว่า 62 คะแนน
if score >= 70 {
fmt.Printf("PASSED")
} else {
// ก็จะทำงานตรงตำแหน่งนี้ เนื่องจากเงื่อนไขอันบนเป็นเท็จ
fmt.Printf("FAILED")
}
}
ผลลัพธ์
ตัวอย่างที่ 2:
- สมมุติมีตัวแปรตัวหนึ่งชื่อ score เป็น integer เก็บคะแนนของนักเรียน
- โดยเงื่อนไขคือ ถ้าคะแนนมากกว่าหรือเท่ากับ 80 ได้เกรด A
- ถ้าคะแนนมากกว่าหรือเท่ากับ 70 ได้เกรด B
- ถ้าคะแนนมากกว่าหรือเท่ากับ 60 ได้เกรด C
- ถ้าน้อยกว่านั้น สอบตกไปเลย = เกรด F
- โดยเราจะเก็บเกรดใส่ตัวแปร grade เอาไว้และนำมาแสดงผลด้านล่างสุด
package main
import "fmt"
func main() {
var score int = 62
var grade string
if score >= 80 {
grade = "A"
} else if score >= 70 {
grade = "B"
} else if score >= 60 {
grade = "C"
} else {
grade = "F"
}
fmt.Printf("Your grade is %s", grade)
}
ผลลัพธ์
SWITCH
การใช้เงื่อนไข switch เป็นอีกหนึ่งวิธีที่ทำได้ลักษณะคล้ายกันกับ if else if โดยใช้เพียงแค่ switch และระบุ statement จาก switch เพียงตัวเดียวในการจัดการ
โดยปกติไอเดียการใช้ switch จะมีอยู่ 2 แบบคือ
- ดักจับจาก variable
- ดักจับจาก condition (เหมือน if else if)
โดยวิธีการใช้งานคือ
switch variable {
case value1:
// code ทำงานเมื่อ variable == value1
case value2:
// code ทำงานเมื่อ variable == value2
default:
// code ทำงานเมื่อ ไม่มี variable match กับเคสไหนเลย
}
มาดูตัวอย่างการใช้งานกัน ตัวอย่างที่ 1:
- สมมุติว่า เราสร้างตัวแปรตัวหนึ่งมาชื่อ dayOfWeek โดยตัวแปรนี้ใช้สำหรับเก็บวันของแต่ละสัปดาห์
- โดยเราจะทำการสร้างเงื่อนไขว่า เราจะแสดงออกมาเป็นชื่อวันแทนโดย
- 1 = Monday (วันจันทร์)
- 2 = Tuesday (วันอังคาร)
- 3 = Wednesday (วันพุธ)
- 4 = Thursday (วันพฤหัส)
- 5 = Friday (วันศุกร์)
- 6 = Saturday (วันเสาร์)
- 7 = Sunday (วันอาทิตย์)
- และถ้าใส่เลขอื่นมา = ให้แสดงคำว่า Invalid Day ออกมา
package main
import "fmt"
func main() {
var dayOfWeek = 3
switch dayOfWeek {
case 1:
fmt.Println("Monday")
case 2:
fmt.Println("Tuesday")
case 3:
fmt.Println("Wednesday")
case 4:
fmt.Println("Thursday")
case 5:
fmt.Println("Friday")
case 6:
fmt.Println("Saturday")
case 7:
fmt.Println("Sunday")
default:
fmt.Println("Invalid Day")
}
}
ผลลัพธ์ (สมมุติว่าใส่เลข 3 เข้าไป)
ตัวอย่างที่ 2:
- เราจะลองประยุกต์ใช้ switch case กับเคสเดียวกันกับ grade ด้านบน (ของ if else if)
- ตัวอย่างนี้คือตัวอย่างที่เหมือนกัน เมื่อเปลี่ยนมาใช้ switch case แบบ condition แทน
package main
import "fmt"
func main() {
var score int = 62
var grade string
switch {
case score >= 80:
grade = "A"
case score >= 70:
grade = "B"
case score >= 60:
grade = "C"
default:
grade = "F"
}
fmt.Printf("Your grade is %s", grade)
}
ผลลัพธ์
** การใช้ switch และ if else นั้นไม่ได้มีเงื่อนไขตายตัวว่าควรใช้ตัวไหนมากกว่ากัน
ตัวไหนทำให้ code อ่านได้ง่ายกว่า และ เหมาะสมต่อการใช้งาน (ไม่ทำให้ condition ซ้ำซ้อนเกินความจำเป็น) = สามารถใช้ได้
Pre process if else
อีกท่าหนึ่งของ if else ที่สามารถทำได้คือ pre process = การกำหนดคำสั่งบางอย่างเป็นค่าเริ่มต้น ก่อนจะทำการเช็คเงื่อนไข
num1 := 5;
num2 := 10;
sumNum := num1 + num2;
if sumNum >= 10 {
fmt.Println("sumNum more than 10")
}
โดย if else สามารถเขียนในรูปย่อแบบนี้ได้
num1 := 5;
num2 := 10;
if sumNum := num1 + num2; sumNum >= 10 {
fmt.Println("sumNum more than 10")
}
Iteration (Loop)
Loop นั้นมีจุดประสงค์ในการวนซ้ำคำสั่ง โดยใน go นั้นจะมี loop อยู่ทั้งหมด 3 ประเภทใหญ่ๆ
- For Loop
- Do While Loop
- While Loop
For Loop
for i := 1; i < 10; i++ {
fmt.Printf("number: %d", i)
}
ผลลัพธ์
Do While Loop
i := 1
for {
fmt.Printf("number: %d\n", i)
i++
if i >= 10 {
break
}
}
ผลลัพธ์จะเหมือนกันกับด้านบน
While Loop
i := 1
for i < 10 {
fmt.Printf("number: %d\n", i)
i++
}
ดังนั้นอย่างที่ทุกคนเห็น
- Loop ทั้ง 3 แบบของ go อยู่บนพื้นฐานคำสั่งเดียวคือ
for
(แตกต่างกับหลายๆภาษาที่มีการแยกคำออกไป)