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: