GO(2) - 函數

1. 定義函數:

定義一個函數 sum 需要 a 和 b 兩個 int 當參數,計算總和後回傳:

package main

import "fmt"

func sum(a int, b int) int {
    return a + b
}

func main() {
    a := 10
    b := 20
    total := a + b
    fmt.Printf("Total is: %d\n", total)
}

2. 函數返回多值:

Go 函數可以像 Python 一樣一次返回多個值。

定義 foo 一次返回兩個 string,再利用短宣告賦值給 s1 和 s2。

func foo() (string, string) {
    return "foo", "bar"
}

func main() {
    s1, s2 := foo()
    fmt.Println(s1, s2)
}

3. 匿名函數:

Go 允許將函數賦值給一個變量,下面我們把一個沒有名字的函數賦值給 sum。

sum := func(a int, b int) int { return a + b }
fmt.Println(sum(10, 20))

這種做法的好處是函數可以當作是一種參數傳給其他函數,map 跟 sort 就是傳遞並調用函數。

compute 的第一個參數 operation 是一個接收兩個 int 回傳一個 int 的函數,其型別為 func(int, int) int

func main() {
    sum := func(a int, b int) int { return a + b }
    multiply := func(a int, b int) int { return a * b }
    
    compute := func(operation func(int, int) int, a int, b int) int { return operation(a, b) }
    fmt.Println(compute(sum, 10, 20))
    fmt.Println(compute(multiply, 10, 20))
}

4. 返回函數+closure:

Go 函數可以返回函數。

下面紅色的字體代表 newCounter 返回的類型是一個函數,這個返回的函數每次被呼叫會回傳一個整數。

func newCounter(base int) func() int {
    return func() int {
        base += 1
        return base
    }
}

func main() {
    counter := newCounter(10)
    fmt.Println(counter()) // 11
    fmt.Println(counter()) // 12
    fmt.Println(counter()) // 13
}

5. Currying:

Go 函數可以寫成 Currying 的形式。

func sum(a int) func(int) int {
    return func(b int) int {
	    return a + b
    }
}

func main() {
    fmt.Println(sum(10)(20))
}

目前還無法領悟 Currying 的好處 QQ


留言

熱門文章