ホームページ  >  記事  >  バックエンド開発  >  Golang 関数ポインタとクロージャ: 概念分析

Golang 関数ポインタとクロージャ: 概念分析

WBOY
WBOYオリジナル
2024-04-15 14:39:011089ブラウズ

要約: 1. 関数ポインタとは何ですか?関数ポインタは関数のアドレスを格納する変数であり、関数をパラメータとして別の関数に渡すことができます。 2. 閉鎖とは何ですか?クロージャは関数にデータを追加する関数であり、関数が呼び出されたときにスコープ変数をキャプチャし、外部変数がスコープから解放されている場合でも関数が参照できるようにします。

Golang 関数ポインタとクロージャ: 概念分析

Golang 関数ポインタとクロージャ: 概念分析

関数ポインタ

A関数ポインタは関数のアドレスを格納する変数です。関数を引数として別の関数に渡すことができます。構文は次のとおりです。

type FuncType func(params) (return type)
var functionPointer FuncType
functionPointer = func(params) (return type) { ... }

Closure

クロージャは、関数に追加データを追加する関数です。関数が呼び出されたときにスコープ変数をキャプチャします。これにより、関数は、スコープによって解放された場合でも、外部変数を参照できるようになります。

構文:

func enclosingFunction(params) (return type) {
    // 外部变量声明
    
    // 内部函数(闭包)
    innerFunction := func(innerParams) (return type) {
        // 内部函数可以访问外部变量
        
        // 返回值
    }
    
    // 返回内部函数(闭包)
    return innerFunction
}

実際のケース: 並べ替え

[]int があるとします。配列、昇順または降順に並べ替えたいとします。 Golang の sort パッケージを使用できます。このパッケージは、比較関数をパラメータとして受け取る Sort 関数を提供します。

次は、クロージャを使用してカスタム比較関数を作成する例です:

package main

import (
    "sort"
)

// 定义排序方式
type SortOrder string

const (
    Ascending SortOrder = "ASC"
    Descending SortOrder = "DESC"
)

// 根据指定顺序创建比较函数
func createComparator(sortOrder SortOrder) func(a, b int) bool {
    return func(a, b int) bool {
        if sortOrder == Ascending {
            return a < b
        }
        return a > b
    }
}

func main() {
    numbers := []int{3, 5, 2, 1, 4}
    
    // 使用升序比较函数排序
    sort.Slice(numbers, createComparator(Ascending))
    
    // 使用降序比较函数排序
    sort.Slice(numbers, createComparator(Descending))
}

この例:

  • createComparator 関数accepts SortOrder を引数として受け取り、比較関数を返します。
  • 比較関数は、createComparator 関数が返された場合でも、sortOrder 変数をキャプチャするクロージャです。
  • 比較関数は、Ascending または Descending を使用して、sortOrder に従って 2 つの数値を順番に比較します。
  • main 関数は、カスタム比較関数を使用して配列を昇順と降順で並べ替える方法を示します。

以上がGolang 関数ポインタとクロージャ: 概念分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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