การควบคุมเงื่อนไขใน Go
ใน Go มีคำสั่งควบคุมเงื่อนไขสามแบบ if, switch, select select มีความพิเศษกว่าสองแบบแรก บทนี้จะไม่กล่าวถึง จะทิ้งไว้แนะนำในบทคอนเคอร์เรนซี
if else
if else มีสาขาการตัดสินมากที่สุดสองสาขา รูปแบบคำสั่งดังนี้
if expression {
}หรือ
if expression {
}else {
}expression ต้องเป็นนิพจน์บูลีน นั่นคือผลลัพธ์เป็นจริงหรือเท็จเท่านั้น ต้องเป็นค่าบูลีน ตัวอย่างดังนี้
func main() {
a, b := 1, 2
if a > b {
b++
} else {
a++
}
}ยังสามารถเขียนนิพจน์ให้ซับซ้อนมากขึ้นได้ เมื่อจำเป็นเพื่อเพิ่มความสามารถในการอ่าน ควรใช้วงเล็บเพื่อแสดงอย่างชัดเจนว่าอะไรควรถูกคำนวณก่อน
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 ยังสามารถมีคำสั่งง่ายๆ บางอย่างได้ เช่น
func main() {
if x := 1 + 1; x > 2 {
fmt.Println(x)
}
}else if
คำสั่ง else if สามารถสร้างสาขาการตัดสินมากขึ้นบนพื้นฐานของ if else รูปแบบคำสั่งดังนี้
if expression1 {
}else if expression2 {
}else if expression3 {
}else {
}ในกระบวนการดำเนินการ การตัดสินของแต่ละนิพจน์เป็นจากซ้ายไปขวา การตัดสินของคำสั่ง if ทั้งหมดเป็นจากบนลงล่าง ตัวอย่างการให้คะแนนตามคะแนนดังนี้ วิธีเขียนแบบแรก
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 ตัดสินจากบนลงล่าง ดังนั้นโค้ดจึงกระชับกว่า
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 ก็เป็นคำสั่งตัดสินหลายสาขาเช่นกัน รูปแบบคำสั่งดังนี้
switch expr {
case case1:
statement1
case case2:
statement2
default:
default statement
}ตัวอย่างง่ายๆ ดังนี้
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)
}ยังสามารถเขียนคำสั่งง่ายๆ บางอย่างก่อนนิพจน์ได้ เช่น การประกาศตัวแปรใหม่
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 สามารถไม่มีนิพจน์ทางเข้าได้
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 เพื่อดำเนินการสาขาถัดไปที่ติดกันต่อไป
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 ตัวอย่างดังนี้
func main() {
A:
a := 1
B:
b := 2
}การใช้ป้ายกำกับอย่างเดียวไม่มีความหมายใดๆ ต้องใช้ร่วมกับคีย์เวิร์ดอื่น
goto
goto จะส่ง控制权ไปยังคำสั่งของป้ายกำกับที่ตรงกันในฟังก์ชันเดียวกัน ตัวอย่างดังนี้
func main() {
a := 1
if a == 1 {
goto A
} else {
fmt.Println("b")
}
A:
fmt.Println("a")
}ในการใช้งานจริง goto ใช้น้อยมาก การกระโดดไปมานี้ลดความสามารถในการอ่านของโค้ดมาก การ消耗ประสิทธิภาพก็เป็นปัญหาหนึ่ง
