関数ポインタは、Go で関数コールバック、遅延実行、ポリモーフィズムに使用されます。クロージャは、状態管理、イベント処理、遅延初期化に使用されます。
#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 サイトの他の関連記事を参照してください。