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