Maison  >  Article  >  développement back-end  >  Scénarios d'application de pointeurs de fonction et de fermetures dans Golang

Scénarios d'application de pointeurs de fonction et de fermetures dans Golang

王林
王林original
2024-04-15 18:18:021149parcourir

Les pointeurs de fonction sont utilisés dans Go pour les rappels de fonctions, l'exécution différée et le polymorphisme. Les fermetures sont utilisées pour la gestion de l'état, la gestion des événements et l'initialisation paresseuse.

Scénarios dapplication de pointeurs de fonction et de fermetures dans Golang

Scénarios d'application de pointeurs de fonction et de fermetures dans Go

Pointeurs de fonction

Les pointeurs de fonction sont des variables qui pointent vers des fonctions. Vous pouvez utiliser le mot clé func pour déclarer le type de pointeur de fonction : 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 保存了内部计数器变量 irrreee

Les pointeurs de fonction peuvent être passés en paramètres à d'autres fonctions : 🎜rrreee🎜🎜Closure🎜🎜🎜Closure fait référence aux variables de la fonction externe portée La fonction. Les fermetures peuvent être créées en définissant des fonctions imbriquées dans les fonctions : 🎜rrreee🎜🎜Scénarios d'application🎜🎜🎜🎜Pointeurs de fonction🎜🎜
  • Pour les rappels de fonction : passez la fonction en argument et appelez-la plus tard. Appelez-la .
  • Exécution différée : stockez le pointeur de fonction dans une variable et exécutez-le si nécessaire.
  • Polymorphisme : le polymorphisme peut être obtenu en passant différents pointeurs de fonction vers la même fonction.
🎜🎜Cas pratique : Tri par pointeurs de fonction🎜🎜rrreee🎜Dans ce cas, les pointeurs de fonction ByName et ByAge précisent le couplePersonne. 🎜🎜🎜Closures🎜🎜
  • Pour la gestion de l'état : les fermetures peuvent enregistrer des variables dans la portée de la fonction, même si la fonction est revenue.
  • Gestion des événements : les fermetures peuvent être utilisées pour créer des fonctions qui répondent à des événements spécifiques.
  • Initialisation paresseuse : les fermetures peuvent être utilisées pour retarder l'initialisation des variables jusqu'à ce qu'elles soient nécessaires.
🎜🎜Cas pratique : Utiliser des fermetures pour implémenter des compteurs🎜🎜rrreee🎜Dans ce cas, la fermeture getCount enregistre la variable interne du compteur i , et renvoie la valeur incrémentée à chaque appel. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn