首頁  >  文章  >  後端開發  >  函數指標和閉包在Golang中的應用場景

函數指標和閉包在Golang中的應用場景

王林
王林原創
2024-04-15 18:18:021151瀏覽

函數指標在 Go 中用於函數回呼、延遲執行和多型性。閉包用於狀態管理、事件處理和延遲初始化。

函數指標和閉包在Golang中的應用場景

函數指標與閉包在Go 中的應用場景

##函數指標

函數指標是指向函數的變數。可以使用

func 關鍵字宣告函數指標類型:

type Fn func(int) int

函數指標可以作為參數傳遞給其他函數:

func apply(fn Fn, arg int) int {
    return fn(arg)
}

閉包

#閉包是引用了外部函數作用域中變數的函數。可以透過在函數中定義巢狀函數來建立閉包:

func counter() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

應用場景函數指標

用於函數回調:傳遞函數作為參數,並在以後某個時候調用它。 延遲執行:將函數指標儲存在變數中,並在需要時執行。

    多態性:透過將不同的函數指標傳遞給相同函數,可以實現多態性。
  • 實戰案例:使用函數指標進行排序
  • type Person struct {
        Name string
        Age  int
    }
    
    type ByName []Person
    
    func (a ByName) Len() int           { return len(a) }
    func (a ByName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    func (a ByName) Less(i, j int) bool { return a[i].Name < a[j].Name }
    
    type ByAge []Person
    
    func (a ByAge) Len() int           { return len(a) }
    func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
    
    func main() {
        people := []Person{
            {Name: "Alice", Age: 30},
            {Name: "Bob", Age: 25},
            {Name: "Charlie", Age: 35},
        }
    
        sort.Sort(ByName(people))
        fmt.Println(people) // [{Name: Alice Age: 30} {Name: Bob Age: 25} {Name: Charlie Age: 35}]
    
        sort.Sort(ByAge(people))
        fmt.Println(people) // [{Name: Bob Age: 25} {Name: Alice Age: 30} {Name: Charlie Age: 35}]
    }
在這個案例中,函數指標

ByNameByAge

指定了對

Person 切片的不同排序標準。 閉包

#########用於狀態管理:閉包可以保存函數作用域中的變量,即使函數已經回傳。 ######事件處理:閉包可以用來建立對特定事件做出回應的函數。 ######延遲初始化:閉包可以用來延遲初始化變量,直到需要它們為止。 ############實戰案例:使用閉包實作計數器######
func main() {
    getCount := counter()

    fmt.Println(getCount()) // 1
    fmt.Println(getCount()) // 2
    fmt.Println(getCount()) // 3
}
###在這個案例中,閉包###getCount### 保存了內部計數器變數# ##i###,並傳回每次呼叫時的遞增值。 ###

以上是函數指標和閉包在Golang中的應用場景的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn