ホームページ >バックエンド開発 >Golang >Golang での関数ポインタとクロージャのアプリケーション シナリオ

Golang での関数ポインタとクロージャのアプリケーション シナリオ

王林
王林オリジナル
2024-04-15 18:18:021193ブラウズ

関数ポインタは、Go で関数コールバック、遅延実行、ポリモーフィズムに使用されます。クロージャは、状態管理、イベント処理、遅延初期化に使用されます。

Golang での関数ポインタとクロージャのアプリケーション シナリオ

#Go での関数ポインターとクロージャのアプリケーション シナリオ

#関数ポインター

#関数ポインタは関数を指す変数です。関数ポインタの型は、func

キーワードを使用して宣言できます。

type Fn func(int) int
関数ポインタは、パラメータとして他の関数に渡すことができます。
func apply(fn Fn, arg int) int {
    return fn(arg)
}

Closure

クロージャは、外部関数のスコープ内の変数を参照する関数です。クロージャは、関数内でネストされた関数を定義することで作成できます。

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

アプリケーション シナリオ

関数ポインター

For関数コールバック: 関数をパラメータとして渡し、将来のある時点でそれを呼び出します。

    遅延実行: 関数ポインターを変数に保存し、必要に応じて実行します。
  • ポリモーフィズム: ポリモーフィズムは、異なる関数ポインターを同じ関数に渡すことによって実現できます。
  • 実際的なケース: 関数ポインターを使用した並べ替え

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}]
}
この場合、関数ポインター ByName

ByAge Person スライスに異なる並べ替え基準を指定します。 クロージャ

状態管理の場合: 関数が戻った場合でも、クロージャは関数スコープ内の変数を保存できます。

    イベント処理: クロージャを使用して、特定のイベントに応答する関数を作成できます。
  • 遅延初期化: クロージャを使用すると、必要になるまで変数の初期化を遅らせることができます。
  • 実際的なケース: クロージャを使用してカウンタを実装する

func main() {
    getCount := counter()

    fmt.Println(getCount()) // 1
    fmt.Println(getCount()) // 2
    fmt.Println(getCount()) // 3
}
この場合、closuregetCount

は内部カウンタ変数を保存します

i を実行し、呼び出しごとに増加した値を返します。

以上がGolang での関数ポインタとクロージャのアプリケーション シナリオの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。