Go Functions

Back to Go Index

Basic Functions

  • กำหนด scope ด้วยปีกกา {curly brackets}
  • สามารถระบุ parameter type ได้
  • สามารถกำหนดการ Return ให้มีมากกว่า 1 ค่า ได้
// No return
func greeting(firstName, lastName string) {
	fmt.Println("Hello", firstName, lastName)
}
 
// Return 1 value
func add(a, b int) int {
	return a + b
}
 
// Return 2 value
func swap(a, b int) (int, int) {
	return b, a
}

Naked Return

เราสามารถคืนค่าโดยไม่ต้องมี argument เรียกว่า “naked” return โดยกำหนดชื่อไว้ที่ function signature แต่ควรใช้กับ function ที่สั้นและไม่ซับซ้อน

// Naked return
func calculate(a, b int) (sum, product int) {
    sum = a + b
    product = a * b
    return
}
 
// Explicit return
func calculate(a, b int) (int, int) {
    sum := a + b
    product := a * b
    return sum, product
}

First Class Function

Go มองเห็น function เป็นสมาชิกอันดับต้น ๆ คือเป็น variable ได้ โดยมี type เป็น func signature

ประกาศเป็นตัวแปร

var add = func(a, b int) int {
	return a + b
}
fmt.Println(add(1, 2))

ประกาศข้างนอก เวลาเอามาใช้ก็เป็นตัวแปรอื่นได้

func main() {
	var cal = add
	fmt.Println(cal(1, 2))
}
 
func add(a, b int) int {
	return a + b
}

รับ parameter เป็น func ได้

func add(a, b int) int {
	return a + b
}
 
func compute(fn func(int, int) int) int {
	v := fn(3, 4)
	return v
}
 
func main() {
	r := compute(add)
	fmt.Println(r)
}

Higher Order Function

ฟังก์ชันใด ๆ ที่รับฟังก์ชันเป็น parameter ได้ หรือคืนค่าออกมาเป็นฟังก์ชันได้ Example

func adder() (func() int, func() int) {
	sum := 0
	return func() int {
		sum = sum + 1
		return sum
	}, func() int {
		return sum
	}
}
 
func main() {
	inc, curr := adder()
	v := inc()
	fmt.Println(v)
	v = inc()
	fmt.Println(v)
	v = curr()
	fmt.Println(v)
}

See also: Higher Order Function Applications

Closure Function

หมายถึง Higher Order Function ที่เราคืนค่าออกมา โดยมีข้อพิเศษคือสามารถอ้างตัวแปรที่อยู่นอก Scope ของมันได้

  • ตัวอย่างฟังก์ชันชื่อ counterFunc() คืนค่าเป็นฟังก์ชันที่คืนค่า int
  • โดยฟังก์ชันนั้นถูกสร้างอยู่ภายใต้ keyword return แต่สามารถอ้างอิงตัวแปร i ที่อยู่นอก scope ได้ เหมือนเชื่อมตัวมันเองออกไปหาตัวแปรตัวอื่น
  • ผลลัพธ์คือเห็นของชิ้นนั้นเหมือนเป็น state ส่วนตัว ดังนั้นเวลาถ้าเรียกหลายครั้ง จำนวนก็จะเพิ่มขึ้นเพราะ state ของ i ที่เชื่อมอยู่เปลี่ยนไป
func counterFunc() func() int {
	var i int
	return func() int {
		i++
		return i
	}
}
 
func main() {
	fn := counterFunc()
	fmt.Println(fn()) // 1
	fmt.Println(fn()) // 2
	fmt.Println(fn()) // 3
}

Variadic Function

Variadic Function สามารถถูกเรียกใช้งานโดยใช้จำนวน arguments เท่าไหร่ก็ได้

func skills(xs ...string) {
	for _, x := range xs {
		fmt.Println("I am good at", x)
	}
}
 
func main() {
	skills("Java", "Go", "Python")
	// I am good at Java
	// I am good at Go
	// I am good at Python
}

See also: Using Slices with Variadic Functions

Anonymous Function

เป็นฟังก์ชันที่ไม่ระบุชื่อ มีประโยชน์ในการใช้งานแบบ inline

func main() { 
   func(){
      fmt.Println("Welcome! to GeeksforGeeks")
  }()
}

ตัวแปรสามารถรับค่าเป็น anonymous function ได้

func main() { 
   value := func(){
      fmt.Println("Welcome! to GeeksforGeeks")
  }
  value()
}

สามารถส่ง arguments ใน anonymous function ได้

func main() {
  func(s string){
      fmt.Println(s)
  }("Hello World!")
}

Related: