Skip to main content

Control structure กับ Go

Control Structure คืออะไร ?​

Control structure ในทาง programming หมายถึงการจัดการ flow ภายใน ชุดคำสั่งของ programming ซึ่งหมายถึงการจัดการลำดับ / เงื่อนไข และการทำซ้ำภายในภาษา programming เพื่อให้ทำงานออกมาลำดับได้ถูกต้อง

ซึ่งปกติจะประกอบด้วยของ 3 อย่างใหญ่ๆ คือ

  1. Sequential = ลำดับของ programming ซึ่งจะเป็นลำดับการทำงานตั้งแต่บนลงล่างมา
  2. Selection (หรือ Condition) = การสร้างทางเลือกจากเงือนไขที่กำหนด ซึ่งจะประกอบไปด้วย if, if-else, switch
  3. Iteration (หรือ Loop) = การสร้าง block สำหรับการทำคำสั่งซ้ำตามเงื่อนไขที่กำหนด ซึ่งปกติจะประกอบไปด้วย for while, do-while

เป้าหมายของการทำ Control structures เพื่อให้สามารถสร้างเงื่อนไขที่ถูกต้องและลำดับที่ถูกต้องในการจัดการคำสั่ง programming ออกมา

Condition​

ในภาษา go สามารถสร้างเงื่อนไขได้ด้วย 2 วิธีใหญ่ๆคือ

  1. ใช้ IF ELSE
  2. ใช้ SWITCH

โดยภายใน condition นั้นจะต้องระบุ statement เพื่อทำการระบุเงื่อนไขที่ต้องการตรวจสอบขึ้นมา

เรามารู้จักพื้นฐานของการสร้างเงื่อนไขก่อน

condition statement​

condition statement คือ statement ทาง programming ที่จะเป็นการระบุเงื่อนไข โดยผลลัพธ์ของ statement นั้นจะคืนค่ากลับมาเป็น true (จริง) หรือ false (เท็จ) ตามเงื่อนไขที่เราระบุ

โดยปกติ statement จะมี 2 แบบใหญ่ๆคือ

  1. 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 อีกที)

  1. 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 แบบใหญ่ๆคือ

  1. การใช้ if else ปกติ (เงื่อนไขแค่เงื่อนไขเดียว)
  2. การใช้ 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")
}
}

ผลลัพธ์ go-control-01

ตัวอย่างที่ 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)
}

ผลลัพธ์ go-control-01

SWITCH​

การใช้เงื่อนไข switch เป็นอีกหนึ่งวิธีที่ทำได้ลักษณะคล้ายกันกับ if else if โดยใช้เพียงแค่ switch และระบุ statement จาก switch เพียงตัวเดียวในการจัดการ

โดยปกติไอเดียการใช้ switch จะมีอยู่ 2 แบบคือ

  1. ดักจับจาก variable
  2. ดักจับจาก 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 เข้าไป) go-control-01

ตัวอย่างที่ 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)
}

ผลลัพธ์ go-control-01

** การใช้ 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 ประเภทใหญ่ๆ

  1. For Loop
  2. Do While Loop
  3. While Loop

For Loop​

for i := 1; i < 10; i++ {
fmt.Printf("number: %d", i)
}

ผลลัพธ์ go-control-01

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 (แตกต่างกับหลายๆภาษาที่มีการแยกคำออกไป)