Skip to content

การควบคุมเงื่อนไขใน Go

ใน Go มีคำสั่งควบคุมเงื่อนไขสามแบบ if, switch, select select มีความพิเศษกว่าสองแบบแรก บทนี้จะไม่กล่าวถึง จะทิ้งไว้แนะนำในบทคอนเคอร์เรนซี

if else

if else มีสาขาการตัดสินมากที่สุดสองสาขา รูปแบบคำสั่งดังนี้

go
if expression {

}

หรือ

go
if expression {

}else {

}

expression ต้องเป็นนิพจน์บูลีน นั่นคือผลลัพธ์เป็นจริงหรือเท็จเท่านั้น ต้องเป็นค่าบูลีน ตัวอย่างดังนี้

go
func main() {
   a, b := 1, 2
   if a > b {
      b++
   } else {
      a++
   }
}

ยังสามารถเขียนนิพจน์ให้ซับซ้อนมากขึ้นได้ เมื่อจำเป็นเพื่อเพิ่มความสามารถในการอ่าน ควรใช้วงเล็บเพื่อแสดงอย่างชัดเจนว่าอะไรควรถูกคำนวณก่อน

go
func main() {
   a, b := 1, 2
    if a<<1%100+3 > b*100/20+6 { // (a<<1%100)+3 > (b*100/20)+6
      b++
   } else {
      a++
   }
}

同时คำสั่ง if ยังสามารถมีคำสั่งง่ายๆ บางอย่างได้ เช่น

go
func main() {
  if x := 1 + 1; x > 2 {
    fmt.Println(x)
  }
}

else if

คำสั่ง else if สามารถสร้างสาขาการตัดสินมากขึ้นบนพื้นฐานของ if else รูปแบบคำสั่งดังนี้

go
if expression1 {

}else if expression2 {

}else if expression3 {

}else {

}

ในกระบวนการดำเนินการ การตัดสินของแต่ละนิพจน์เป็นจากซ้ายไปขวา การตัดสินของคำสั่ง if ทั้งหมดเป็นจากบนลงล่าง ตัวอย่างการให้คะแนนตามคะแนนดังนี้ วิธีเขียนแบบแรก

go
func main() {
   score := 90
   var ans string
   if score == 100 {
      ans = "S"
   } else if score >= 90 && score < 100 {
      ans = "A"
   } else if score >= 80 && score < 90 {
      ans = "B"
   } else if score >= 70 && score < 80 {
      ans = "C"
   } else if score >= 60 && score < 70 {
      ans = "E"
   } else if score >= 0 && score < 60 {
      ans = "F"
   } else {
      ans = "nil"
   }
   fmt.Println(ans)
}

วิธีเขียนแบบที่สองใช้ประโยชน์จากสมมติฐานที่ว่าคำสั่ง if ตัดสินจากบนลงล่าง ดังนั้นโค้ดจึงกระชับกว่า

go
func main() {
  score := 90
  var ans string
  if score >= 0 && score < 60 {
    ans = "F"
  } else if score < 70 {
    ans = "D"
  } else if score < 80 {
    ans = "C"
  } else if score < 90 {
    ans = "B"
  } else if score < 100 {
    ans = "A"
  } else if score == 100 {
    ans = "S"
    }else {
        ans = "nil"
    }
  fmt.Println(ans)
}

switch

คำสั่ง switch ก็เป็นคำสั่งตัดสินหลายสาขาเช่นกัน รูปแบบคำสั่งดังนี้

go
switch expr {
  case case1:
    statement1
  case case2:
    statement2
  default:
    default statement
}

ตัวอย่างง่ายๆ ดังนี้

go
func main() {
   str := "a"
   switch str {
   case "a":
      str += "a"
      str += "c"
   case "b":
      str += "bb"
      str += "aaaa"
   default: // เมื่อทุก case ไม่ตรงกันแล้ว จะดำเนินการสาขา default
      str += "CCCC"
   }
   fmt.Println(str)
}

ยังสามารถเขียนคำสั่งง่ายๆ บางอย่างก่อนนิพจน์ได้ เช่น การประกาศตัวแปรใหม่

go
func main() {
  switch num := f(); { // เทียบเท่ากับ switch num := f(); true {
  case num >= 0 && num <= 1:
    num++
  case num > 1:
    num--
    fallthrough
  case num < 0:
    num += num
  }
}

func f() int {
  return 1
}

คำสั่ง switch สามารถไม่มีนิพจน์ทางเข้าได้

go
func main() {
   num := 2
   switch { // เทียบเท่ากับ switch true {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
   case num < 0:
      num *= num
   }
   fmt.Println(num)
}

ใช้คีย์เวิร์ด fallthrough เพื่อดำเนินการสาขาถัดไปที่ติดกันต่อไป

go
func main() {
   num := 2
   switch {
   case num >= 0 && num <= 1:
      num++
   case num > 1:
      num--
      fallthrough // หลังดำเนินการสาขานี้แล้ว จะดำเนินการสาขาถัดไปต่อไป
   case num < 0:
      num += num
   }
   fmt.Println(num)
}

label

คำสั่งป้ายกำกับ ให้ป้ายกำกับกับบล็อกโค้ดหนึ่งบล็อก สามารถเป็นเป้าหมายของ goto, break, continue ตัวอย่างดังนี้

go
func main() {
  A:
    a := 1
  B:
    b := 2
}

การใช้ป้ายกำกับอย่างเดียวไม่มีความหมายใดๆ ต้องใช้ร่วมกับคีย์เวิร์ดอื่น

goto

goto จะส่ง控制权ไปยังคำสั่งของป้ายกำกับที่ตรงกันในฟังก์ชันเดียวกัน ตัวอย่างดังนี้

go
func main() {
   a := 1
   if a == 1 {
      goto A
   } else {
      fmt.Println("b")
   }
A:
   fmt.Println("a")
}

ในการใช้งานจริง goto ใช้น้อยมาก การกระโดดไปมานี้ลดความสามารถในการอ่านของโค้ดมาก การ消耗ประสิทธิภาพก็เป็นปัญหาหนึ่ง

Golang by www.golangdev.cn edit