go語言學習-函式

gxyz發表於2018-03-25

函式宣告

函式宣告包括函式名,形參列表,返回值列表(可選),函式體組成

func test(parameters) (returns) {
    // ...
}

其中 parameters 就是函式的形參列表,描述了函式的引數名和引數型別,可以沒有引數但是這個括號不可以省略; returns就是返回值列表,描述了函式返回值的變數名(可選)和型別, 如果函式返回一個沒有名字的引數或者沒有返回值,就可以不要括號

這裡的引數和返回值的型別都不能省略,不過可以簡寫(如果有的話)

例如:

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

// 可以簡寫成
func add(x, y int) int {
    return x + y;
}

這裡需要注意的是函式呼叫都必須按照宣告順序為所有的引數提供實參.並且Go語言的函式沒有預設值,也不能通過引數名指定形參,因此形參和返回值的變數名對於函式呼叫者是沒有用處的,只是在函式內部使用

引數的傳遞方式

如果實參是引用型別,如指標,slice,map,function,channel等型別,在函式內部進行修改,就會影響到傳入的實參;

其他型別的實參是傳遞的是值的拷貝,對其修改不會影響函式外部。

變長引數

語法:

func test(x int, ns ...int) {
    //...
}

就是在引數型別前面加上三個點 “…”,這裡需要注意的地方是這個變參本質上是一個slice,可在函式內部直接訪問,並且一個函式只能有一個變長引數,並且只能在最後的位置

例如:

func add(x int, nums ...int) int {
    for i := range nums {
        x += nums[i]
    }
    return x
}

上面就是實現n個數的加法

同時在呼叫變參函式是,也可以將slice作為實參,不過需要展開,就是在slice後面加 “…”

呼叫方式:

add(10, 20, 30)  // 60

// 也可以使用slice
s := []int{10, 20, 40}
add(10, ...s)  // 80

多返回值

Go語言的函式支援多個返回值

func test() (int, int) {
    return 1, 2
}

此時就返回兩個值,就需要有兩個變數來接收,也可以使用 _ 接收來忽略某個引數

同時我們還可以為返回值起個名字

func test() (x int, y, int) {
    x = 10
    y = 10
    return
}

此時就可以使用return 隱式的返回引數了,會自動返回對應名字的引數,注意這裡的返回值的名字不會影響函式外部.

匿名函式

go也支援匿名函式,可以直接賦值給變數,或者當做結構體的欄位等

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

// 然後就可以使用變數名呼叫
add(10, 20)  // 30

函式的特點總結

  • 函式宣告包括函式名,形參列表,返回值列表(可選),函式體組成
  • 不支援引數預設值
  • 如果實參是引用型別,如指標,slice,map,function,channel等型別,進行修改,就回影響實參;
  • 其他型別的實參是傳遞的是值的拷貝,對其修改不會影響函式外部
  • 支援變長引數
  • 支援多返回值

相關文章