網頁

2021/6/13

Golang 宣告函式 function declarations

Go語言宣告函式(function)的方式如下。


Go使用func關鍵字來宣告函式。

例如下面宣告了兩個函式,main()add()main()程式中呼叫add()並傳入參數1和2。

package main

import "fmt"

func add(x int, y int) int {
    return x + y
}

func main() {
    result := add(1, 2) // 呼叫add()函式,傳入參數1, 2,取得回傳結果result
    fmt.Println(result) // 3
}

Go與C家族語言(e.g: C, C++, Java, C#)的函式差別在於,Go的函式輸入參數的型態是定義在參數名稱後面,且回傳值型態是寫在參數後面。所以上面add()接收兩個參數xy,型態皆為int;返回型態為int

比對下面Java定義方法add()的寫法,可以看到參數型態是寫在參數名稱前,返回型態是寫在方法名稱前。

/** Java method */
private int add(int x, int y) {
    return x + y;
}

若參數型態相同則型態可合併宣告,例如上面的add()的兩個參數xy型態皆為int可合併簡寫如下。

func add(x, y int) int {
    return x + y
}

Go的函式可回傳多個值,例如下面half()回傳兩個string

package main

import "fmt"

func half(s string) (string, string) { // 回傳兩個string
    n := len(s) // 取得字串s的長度放入變數n
    return s[0:n/2], s[n/2:n] // 第一個回傳s前半的字,第二個回傳s後半的字
}

func main() {
    a, b := half("直的進去躺著出來") // 用變數a, b接受half()的兩個回傳值。
    fmt.Println(a) // 直的進去
    fmt.Println(b) // 躺著出來
}

執行印出結果如下。

直的進去
躺著出來

回傳值可以給予名稱,例如修改上面的half()如下,兩個回傳值名稱分別為firstHalflastHalf,則相當於在函式頂部宣告了同名的兩個變數且回傳不用指定,會以同名的變數回傳,又稱為naked return。

func half(s string) (firstHalf, lastHalf string) {
    n := len(s)
    firstHalf = s[0:n/2] // 第一個回傳結果firstHalf
    lastHalf = s[n/2:n]  // 第二個回傳結果lastHalf
    return // 不用指定回傳的變數
}

有命名的回傳相當於下面。

func half(s string) (string, string) {
    var firstHalf string
    var lastHalf string
    
    n := len(s)
    firstHalf = s[0:n/2]
    lastHalf = s[n/2:n]
    return firstHalf, lastHalf
}

函式也可以function literal的方式定義為匿名函式。

add := func(x, y int) int { // function literal
   return x + y
}
fmt.Println(add(1, 2)) // 3

function literal函式若參照外部函式的變數則稱為closure。例如下面add()參照外部的變數c

package main

import "fmt"

func main() {
    c := 0
    add := func (x, y int) (int, int) {
        c++
        return x + y, c
    }

    r, c := add(1, 2)
    fmt.Printf("r=%d, c=%d\n", r, c) // r=3, c=1
    r, c = add(3, 4)
    fmt.Printf("r=%d, c=%d\n", r, c) // r=7, c=2

}


沒有留言:

張貼留言