Heim  >  Artikel  >  Backend-Entwicklung  >  Anwendungsszenarien von Funktionszeigern und -abschlüssen in Golang

Anwendungsszenarien von Funktionszeigern und -abschlüssen in Golang

王林
王林Original
2024-04-15 18:18:021106Durchsuche

Funktionszeiger werden in Go für Funktionsrückrufe, verzögerte Ausführung und Polymorphismus verwendet. Abschlüsse werden für die Zustandsverwaltung, die Ereignisbehandlung und die verzögerte Initialisierung verwendet.

Anwendungsszenarien von Funktionszeigern und -abschlüssen in Golang

Anwendungsszenarien von Funktionszeigern und -abschlüssen in Go

Funktionszeiger

Funktionszeiger sind Variablen, die auf Funktionen zeigen. Sie können das Schlüsselwort func verwenden, um den Funktionszeigertyp zu deklarieren: 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

Funktionszeiger können als Parameter an andere Funktionen übergeben werden: 🎜rrreee🎜🎜Closure🎜🎜🎜Closure bezieht sich auf Variablen in der externen Funktion Umfang Die Funktion. Abschlüsse können erstellt werden, indem verschachtelte Funktionen innerhalb von Funktionen definiert werden: 🎜rrreee🎜🎜Anwendungsszenarien🎜🎜🎜🎜Funktionszeiger🎜🎜
  • Für Funktionsrückrufe: Übergeben Sie die Funktion als Argument und rufen Sie sie zu einem späteren Zeitpunkt auf. Rufen Sie sie auf .
  • Verzögerte Ausführung: Speichern Sie den Funktionszeiger in einer Variablen und führen Sie ihn bei Bedarf aus.
  • Polymorphismus: Polymorphismus kann durch die Übergabe verschiedener Funktionszeiger an dieselbe Funktion erreicht werden.
🎜🎜Praktischer Fall: Sortieren mit Funktionszeigern🎜🎜rrreee🎜In diesem Fall geben die Funktionszeiger ByName und ByAge das Paar Person-Slices. 🎜🎜🎜Closures🎜🎜
  • Zur Statusverwaltung: Closures können Variablen im Funktionsumfang speichern, auch wenn die Funktion zurückgegeben wurde.
  • Ereignisbehandlung: Mit Schließungen können Funktionen erstellt werden, die auf bestimmte Ereignisse reagieren.
  • Verzögerte Initialisierung: Abschlüsse können verwendet werden, um die Initialisierung von Variablen zu verzögern, bis sie benötigt werden.
🎜🎜Praktischer Fall: Verwendung von Abschlüssen zur Implementierung von Zählern🎜🎜rrreee🎜In diesem Fall speichert der Abschluss getCount die interne Zählervariable i , und gibt bei jedem Aufruf den inkrementierten Wert zurück. 🎜

Das obige ist der detaillierte Inhalt vonAnwendungsszenarien von Funktionszeigern und -abschlüssen in Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn