ข้ามไปยังเนื้อหา

Control Flow

Control flow: ส่วนใหญ่คุ้นเคย มีหนึ่งเรื่องที่น่าแปลกใจ

หัวข้อที่มีชื่อว่า “Control flow: ส่วนใหญ่คุ้นเคย มีหนึ่งเรื่องที่น่าแปลกใจ”

TypeScript มี if, for, for...of, for...in, while, do...while และ switch ส่วน Go มีแค่ if, for และ switch — โดย for ตัวเดียวทำหน้าที่ของ loop ทุกแบบ ไม่มี keyword while พอได้ลองใช้จริง คุณจะติดใจความเรียบง่ายแบบนี้

if ของ Go คล้ายกับของ TypeScript แต่ไม่มีวงเล็บล้อมรอบเงื่อนไข และต้องมีปีกกาเสมอ

TypeScript
if (score > 90) {
console.log("A");
} else if (score > 70) {
console.log("B");
} else {
console.log("C");
}
Go
if score > 90 {
fmt.Println("A")
} else if score > 70 {
fmt.Println("B")
} else {
fmt.Println("C")
}

for ของ Go ครอบคลุมรูปแบบการวน loop ทุกแบบ:

TypeScript
// C-style
for (let i = 0; i < 5; i++) { ... }
// while
while (condition) { ... }
// infinite
while (true) { ... }
// for...of
for (const item of items) { ... }
Go
// C-style
for i := 0; i < 5; i++ { ... }
// while (drop init and post)
for condition { ... }
// infinite
for { ... }
// range (like for...of)
for i, item := range items { ... }

switch ของ Go ไม่ fall through โดยอัตโนมัติ (ต่างจาก JavaScript/TypeScript ที่ต้องใส่ break) แต่ละ case เป็นอิสระต่อกัน ถ้าต้องการพฤติกรรมแบบเดิม ใส่ fallthrough เองได้

TypeScript
switch (day) {
case "Mon":
case "Tue":
console.log("Weekday");
break; // required!
case "Sat":
case "Sun":
console.log("Weekend");
break;
default:
console.log("Unknown");
}
Go
switch day {
case "Mon", "Tue", "Wed", "Thu", "Fri":
fmt.Println("Weekday") // no break needed
case "Sat", "Sun":
fmt.Println("Weekend")
default:
fmt.Println("Unknown")
}

range วนซ้ำผ่าน slices, maps, strings และ channels สำหรับ slice จะให้ทั้ง index และ value ใช้ _ เพื่อทิ้งค่าใดค่าหนึ่งได้

TypeScript
const nums = [10, 20, 30];
// index + value
nums.forEach((v, i) => console.log(i, v));
// value only
for (const v of nums) { console.log(v); }
Go
nums := []int{10, 20, 30}
// index + value
for i, v := range nums {
fmt.Println(i, v)
}
// value only (discard index)
for _, v := range nums {
fmt.Println(v)
}
package main
import "fmt"
func classify(n int) string {
switch {
case n < 0:
return "negative"
case n == 0:
return "zero"
case n < 10:
return "small"
default:
return "large"
}
}
func main() {
nums := []int{-3, 0, 7, 42}
for _, n := range nums {
fmt.Printf("%d is %s\n", n, classify(n))
}
}
ใน Go คีย์เวิร์ดใดที่มาแทน while, do...while และ for...of?
switch ของ Go fall through โดยอัตโนมัติหรือไม่?
_ หมายถึงอะไรเมื่อใช้กับ range?
ข้อใดถูกต้องสำหรับ Go — วงเล็บล้อมรอบเงื่อนไข if?