1. 程式人生 > 遊戲攻略 >《寶可夢朱紫》快速刷錢方法視訊教學 怎麼快速刷錢

《寶可夢朱紫》快速刷錢方法視訊教學 怎麼快速刷錢

GO函式

1.1 函式分類

在go語言中,函式是第一類物件,我們可以將函式儲存到變數中。函式主要有具名和匿名之分,包級函式一般都是具名函式,具名函式是匿名函式的一種特例,當匿名函式引用了外部作用域中的變數時就成了閉包函式,閉包函式是函數語言程式設計語言的核心。

舉例程式碼如下:

  1. 具名函式:就和C語言中的普通函式意義相同,具有函式名,返回值以及函式引數的函式。

    func Add(a,b int) int {
        return a+b
    }
    
  2. 匿名函式:指不需要定義函式名的一種函式實現方式,它由一個不帶函式名的函式宣告和函式體組成。

    var Add = func(a, b int) int {
        return a+b
    }
    

    解釋幾個名詞如下:

    ​ 1.閉包函式:返回為函式物件,不僅僅是一個函式物件,在該函式外還包裹了一層作用域,這使得,該函式無論在何處呼叫,優先使用自己外層包裹的作用域。

    ​ 2.一級物件:支援閉包的多數語言都將函式作為第一級物件,就是說函式可以儲存到變數中作為引數傳遞給其他函式,最重要的是能夠被函式動態建立和返回。

    ​ 3.包:go的每一個檔案都是屬於一個包的,也就是說go是以包的形式來管理檔案和專案目錄結構的

1.2 函式宣告和定義

GO語言函式定義格式如下:

func function_name([parameter list])[return types]{
    函式體
}
解析
func 函式由func開始宣告
function_name 函式名稱
parameter list 引數列表
return_types 返回型別
函式體 函式定義的程式碼集合

1.3 函式傳參

Go語言中的函式可以有多個引數和多個返回值,引數和返回值都是以傳值的方式和被呼叫者交換資料。在語法上,函式還支援可變數量的引數,可變數量的引數必須是最後出現的引數,可變數量的引數其實是一個切片型別的引數。

當可變引數是一個空介面型別時,呼叫者是否解包可變引數會導致不同的結果,我們解釋一下解包的含義,程式碼如下:

func main(){
    var a = []int{1,2,3}
    Print(a...)		// 解包
    Print(a)		// 未解包
}

func Print(a ...int{}){
    fmt.Println(a...)
}

以上當傳入引數為a...時即是對切片a進行了解包,此時其實相當於直接呼叫Print(1,2,3)。當傳入引數直接為 a時等價於直接呼叫Print([]int{}{1,2,3})

1.4 函式返回值

不僅函式的引數可以有名字,也可以給函式的返回值命名。

舉例程式碼如下:

func Find(m map[int]int,key int)(value int, ok bool){
    value,ok = m[key]
    return
}

如果返回值命名了,可以通過名字來修改返回值,也可以通過defer語句在return語句之後修改返回值,舉例程式碼如下:

func main(){
    for i := 0;i<3;i++{
        defer func(){fmt.println(i)}()
    }
}

// 該函式最終的輸出為:
// 3
// 3
// 3

以上程式碼中如果沒有defer其實返回值就是0,1,2,但defer語句會在函式return之後才會執行,也就是或只有以上函式在執行結束return之後才會執行defer語句,而該函式return時的i值將會達到3,所以最終的defer語句執行printlin的輸出都是3。

defer語句延遲執行的其實是一個匿名函式,因為這個匿名函式捕獲了外部函式的區域性變數v,這種函式我們一般叫閉包。閉包對捕獲的外部變數並不是傳值方式訪問,而是以引用的方式訪問。

這種方式往往會帶來一些問題,修復方法為在每一輪迭代中都為defer函式提供一個獨有的變數,修改程式碼如下:

func main() {
    for i := 0; i < 3; i++ {
        i := i // 定義一個迴圈體內區域性變數i
        defer func(){ println(i) } ()
    }
}

func main() {
    for i := 0; i < 3; i++ {
        // 通過函式傳入i
        // defer 語句會馬上對呼叫引數求值
        // 不再捕獲,而是直接傳值
        defer func(i int){ println(i) } (i)
    }
}

1.5 遞迴呼叫(遞迴函式)

Go語言中,函式還可以直接或間接地呼叫自己,也就是支援遞迴呼叫。Go語言函式的遞迴呼叫深度邏輯上沒有限制,函式呼叫的棧是不會出現溢位錯誤的,因為Go語言執行時會根據需要動態地調整函式棧的大小。這部分的知識將會涉及goroutint和動態棧的相關知識。

它的語法和c很相似,格式如下:

func recursion(){
    recursion() /* 函式呼叫自身 */
}

func main() {
    recursion()
}