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