Golang 基礎之函式使用 (一)

帽兒山的槍手發表於2022-05-27

大家好,今天將梳理出的 Go語言函式用法內容,分享給大家。 請多多指教,謝謝。

本次《Go語言函式使用》內容共分為三個章節,本文為第一章節。

  • Golang 基礎之函式使用 (一)
  • Golang 基礎之函式使用 (二)
  • Golang 基礎之函式使用 (三)

本章節內容

  • 函式介紹
  • 函式特點
  • 函式宣告
  • 傳參方式
  • 不定引數傳值
  • 任意引數型別的不定引數
  • 返回值

函式介紹

為了完成某一功能的程式指令(語句)的集合,稱為函式。

Go 語言的函式可以分為:自定義函式和系統函式。Go 語言函式與其他語言函式最大的不同是,Go 語言的函式可以支援返回任意多個值,而其他語言的函式一般只支援返回一個值。

比如C語言函式返回值只能是一種型別。

Go 語言的函式也支援普通函式、匿名函式和閉包三種形式。

函式特點

  • 無需宣告原型
  • 支援不定變參
  • 支援多返回值
  • 支援命名返回引數
  • 支援匿名函式和閉包 (變向的高階函式)
  • 函式也是一種型別,一個函式可以賦值給變數
  • 不支援巢狀 (nested) 一個包不能有兩個名字一樣的函式
  • 不支援過載 (overload)
  • 不支援預設引數 (default parameter)

函式宣告

函式宣告包括函式名、形式引數列表、返回值列表(可省略)以及函式體。

func name(parameter-list) (result-list) {   // 宣告函式名
  // 函式體
}

如果函式返回一個無名變數或者沒有返回值,返回值列表的括號是可以省略的。如果一個函式宣告不包括返回值列表,那麼函式體執行完畢後,不會返回任何值。

傳參方式

值傳遞

指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。

func num(x, y int) int {
       // 處理邏輯
}

引用傳遞

是指在呼叫函式時將實際引數的地址傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。

func swap(x, y *int) {
    var temp int

    temp = *x /* 儲存 x 的值 */
    *x = *y   /* 將 y 值賦給 x */
    *y = temp /* 將 temp 值賦給 y*/
}

無論是值傳遞,還是引用傳遞,傳遞給函式的都是變數的副本,不過,值傳遞是值的拷貝。

引用傳遞是地址的拷貝,一般來說,地址拷貝更為高效。而值拷貝取決於拷貝的物件大小,物件越大,則效能越低。

map、slice、chan、指標、interface預設以引用的方式傳遞。

不定引數傳值

函式的引數不是固定,後面的型別是固定的。 (可變引數)

golang可變引數本質上就是slice。

在引數賦值時可以不用一一的賦值,可以直接傳遞一個陣列或者切片,注意在引數後加上 即可。

func myfunc(args ...int) {    //0個或多個引數
}

func add(a int, args ...int) int {    //1個或多個引數
}

func add(a int, b int, args ...int) int {    //2個或多個引數
}
其中args是一個slice型別,我們可以通過 arg[index] 依次訪問所有引數,通過 len(arg) 來判斷傳遞引數的個數。

使用slice物件做變參時,必須展開。

package main

import (
    "fmt"
)

func sum(s string, n ...int) string {
    var x int
    for _, i := range n {
        x += i
    }
    return fmt.Sprintf(s, x) // 字串拼接
}

func main() {
    s := []int{1, 2, 3}
    res := sum("sum: %d", s...)    // slice... 展開slice
    println(res)
}

輸出結果

sum: 6

任意型別的不定引數

函式的引數和每個引數的型別都不是固定的。

interface{} 傳遞任意型別資料是Go語言的慣例用法,而且 interface{} 的型別是安全的。

func myfunc(args ...interface{}){ // 示例用法
  ...
}

返回值

_ 識別符號,用來忽略函式的某個返回值。

Go 的返回值可以被命名, 返回值的名稱應當具有一定意義。

沒有引數的 return 語句返回各個返回變數的當前值,這種用法被稱作“裸”返回。
func myfunc(arg int) (arg int) { // 示例用法
   return arg
}

技術文章持續更新,請大家多多關注呀~~

搜尋微信公眾號【 帽兒山的槍手 】,關注我

相關文章