首頁 > 軟體

GO語言函數(func)的宣告與使用詳解

2022-12-21 14:00:40

GO語言函數介紹

GO是編譯性語言,所以函數的順序是無關緊要的,為了方便閱讀,建議入口函數main寫在最前面,其餘函數按照功能需要進行排列

GO的函數不支援巢狀,過載和預設引數GO的函數支援 無需宣告變數,可變長度,多返回值,匿名,閉包等GO的函數用func來宣告,且左大括號{不能另起一行

一個簡單的範例:

package main
import "fmt"
func main(){
    fmt.Println("呼叫函數前。。。")
    hello()
    fmt.Println("呼叫函數後。。。")
}
func hello() {
    fmt.Println("呼叫函數中...")
}

輸出為:

呼叫函數前。。。
呼叫函數中...
呼叫函數後。。。

GO語言函數引數與返回值

引數:可以傳0個或多個值來供自己用

返回:通過用return 來進行返回

package main
import "fmt"
func main(){
    a, b, c := 1, 2, 3
    d, e, f := test(a, b, c)
    fmt.Println(a, b, c, d, e, f)
}
func test(a int, b int, c int) (d int, e int, f int) {
    d = a + 3
    e = b + 3
    f = c + 3
    return d, e, f
}

輸出為:

1 2 3 4 5 6

上面就是一個典型的多引數傳遞與多返回值
對例子的說明:

  • 首先定義了a,b,c三個變數,並進行賦值為1,2,3
  • 呼叫test()函數,因為預先知道這個會返回三個值,所以我們用d,e,f進行接收返回的值
  • test函數中func test(a int, b int, c int)這一段是接收傳入的引數,(d int, e int, f int) {這一段是定義返回的值
  • test裡,對d,e,f變數分別在a,b,c的基礎上加上了3,並返回
  • 列印所有變數

按值傳遞與按參照傳遞

按值傳遞:是對某個變數進行復制,不能更改原變數的值
參照傳遞:相當於按指標傳遞,可以同時改變原來的值,並且消耗的記憶體會更少,只有4或8個位元組的消耗

命名的返回值

在上例中,返回值(d int, e int, f int) {是進行了命名,如果不想命名可以寫成(int,int,int){,返回的結果都是一樣的,但要注意:

  • 寫成後面這種形式時,在函數內剖,像d,e,f這些變數就不能直接使用,要先定義才能使用;
  • 返回值return d,e,f 一定要跟返回的值,前一種方式是可以不寫返回值,可以直接return
  • 在正常工作,當然是建意第一種寫法,這樣會讓程式碼的可讀性更高

返回空白符

當返回了多個值,我們某些變數不想要,或實際用不到,我們可以使用_來補位,例如上例的返回我們可以寫成d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來捨棄掉

GO語言函數傳遞可變長度的引數

在引數後面以變數 ... type這種形式的,我們就要以判斷出這是一個可變長度的引數

package main
import "fmt"
func main(){
    ke("a", "b", "c", "d", "e")
}
func ke(a string, strs ...string) {
    fmt.Println(a)
    fmt.Println(strs)
    for _, v := range strs {
        fmt.Println(v)
    }
}

輸出為:

a
[b c d e]
b
c
d
e

在上例中,strs ...string中,strs的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的引數的例子,更多一些演變的形式,都非常類似

GO語言函數defer 的應用

在GO中defer關鍵字非常重要,相當於面相對像中的解構函式,也就是在某個函數執行完成後,GO會自動這個;
如果在多層迴圈中函數裡,都定義了defer,那麼它的執行順序是先進後出;
當某個函數出現嚴重錯誤時,defer也會被呼叫

package main
import "fmt"
func main(){
    defers("a", "b")
}
func defers(a string, b string) {
    fmt.Println(a)
    defer fmt.Println("最後呼叫...")
    fmt.Println(b)
}

輸出為

a
b
最後呼叫...

這是一個最簡單的測試了,當然還有更復雜的呼叫,比如偵錯程式時,判斷是哪個函數出了問題,完全可以根據defer列印出來的內容來進行判斷,非常快速,這種留給你們去實現

GO語言遞迴函數

一個函數在函數體內自己呼叫自己我們稱之為遞迴函數,在做遞迴呼叫時,經常會將記憶體給佔滿,這是非常要注意的,常用的比如,快速排序就是用的遞迴呼叫

GO語言內建函數

append -- 用來追加元素到陣列、slice中,返回修改後的陣列、slice
close -- 主要用來關閉channel delete -- 從map中刪除key對應的value
panic -- 停止常規的goroutine (panic和recover:用來做錯誤處理)
recover -- 允許程式定義goroutine的panic動作
imag -- 返回complex的實部 (complex、real imag:用於建立和操作複數)
real -- 返回complex的虛部 make -- 用來分配記憶體,返回Type本身(只能應用於slice, map, channel)
new -- 用來分配記憶體,主要用來分配值型別,比如int、struct。返回指向Type的指標
cap -- capacity是容量的意思,用於返回某個型別的最大容量(只能用於切片和 map)
copy -- 用於複製和連線slice,返回複製的數目 len -- 來求長度,比如string、array、slice、map、channel ,返回長度
print、println -- 底層列印函數,在部署環境中建議使用 fmt 包

本篇重點介紹了GO函數(func)的宣告與使用,更多關於GO語言函數知識請檢視下面的相關連結


IT145.com E-mail:sddin#qq.com