Functions
Functions: พื้นที่ที่คุ้นเคย
หัวข้อที่มีชื่อว่า “Functions: พื้นที่ที่คุ้นเคย”ฟังก์ชันใน TypeScript มีความยืดหยุ่นสูง — arrow function, default params, rest params, การคืนค่าแบบ tuple ฟังก์ชันใน Go ชัดเจนกว่าแต่ก็ทรงพลังพอกัน สิ่งที่นักพัฒนา TypeScript จะแปลกใจมากที่สุดคือ ฟังก์ชันใน Go คืนค่าได้หลายค่าโดยตรง โดยไม่ต้องห่อเป็น tuple หรือ array
ไวยากรณ์ฟังก์ชันพื้นฐาน
หัวข้อที่มีชื่อว่า “ไวยากรณ์ฟังก์ชันพื้นฐาน”function add(a: number, b: number): number { return a + b;}
// Arrow functionconst greet = (name: string): string => { return `Hello, ${name}!`;};func add(a int, b int) int { return a + b}
// No arrow functions — just funcfunc greet(name string) string { return "Hello, " + name + "!"}การคืนค่าหลายค่า
หัวข้อที่มีชื่อว่า “การคืนค่าหลายค่า”ใน TypeScript การคืนค่าสองอย่างหมายถึงต้องใช้ tuple หรือ object แต่ใน Go การคืนค่าหลายค่าเป็นฟีเจอร์ระดับ first-class ที่ใช้กันทุกที่ — โดยเฉพาะการคืนผลลัพธ์พร้อมกับ error
// TypeScript: tuple or objectfunction divide(a: number, b: number): [number, Error | null] { if (b === 0) return [0, new Error("division by zero")]; return [a / b, null];}const [result, err] = divide(10, 2);// Go: multiple return valuesfunc divide(a, b float64) (float64, error) { if b == 0 { return 0, fmt.Errorf("division by zero") } return a / b, nil}result, err := divide(10, 2)Variadic functions
หัวข้อที่มีชื่อว่า “Variadic functions”variadic ของ Go ทำงานเหมือน rest parameter ของ TypeScript เป๊ะ ๆ ใช้ ...T ในรายการ parameter แล้วข้างในฟังก์ชันจะได้ค่าออกมาเป็น slice
function sum(...nums: number[]): number { return nums.reduce((a, b) => a + b, 0);}sum(1, 2, 3, 4);func sum(nums ...int) int { total := 0 for _, n := range nums { total += n } return total}sum(1, 2, 3, 4)ลองเล่นดู
หัวข้อที่มีชื่อว่า “ลองเล่นดู”package main
import ( "errors" "fmt")
func add(a, b int) int { return a + b}
func divide(a, b float64) (float64, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil}
func sum(nums ...int) int { total := 0 for _, n := range nums { total += n } return total}
func main() { fmt.Println(add(3, 4))
result, err := divide(10, 3) if err != nil { fmt.Println("Error:", err) } else { fmt.Printf("10 / 3 = %.4f\n", result) }
fmt.Println(sum(1, 2, 3, 4, 5))}Loading Go runtime (first run only, ~8 MB)…