クロージャは、関数が外部変数にアクセスできるようにする Go の機能で、同時プログラミングに役立ちます。クロージャを通じて、コルーチンは安全にデータを共有し、値を渡すことができます。並行プログラミングにおけるクロージャの一般的な用途には、同期メカニズムを必要としないデータの共有が含まれます。クロージャが閉じられるまで値が使用できない場合でも、コルーチン間で値を渡します。コルーチンをキャンセルするには、キャンセル操作を示すチャネルを保存します。
クロージャは、関数が外部変数にアクセスできるようにする Go 言語の強力な機能です。このメカニズムは、コルーチン間でデータを安全に共有し、値を渡すことができるため、同時プログラミングで非常に役立ちます。
クロージャは、関数と、その関数を含むスコープ内のすべての変数のコレクションを指します。 Go では、関数は別の関数へのポインターを返すことができます (クロージャ)。このクロージャは、親関数が返された場合でも、親関数のスコープ内のすべての変数にアクセスできます。
たとえば、次のコードは単純なクロージャを示しています。
func outer(x int) func() int { // x 的值在这个闭包内部可用 return func() int { return x } }
outer
この関数は、return 関数呼び出しにアクセスして返すクロージャを返します。 変数 # の値##バツ###。 同時プログラミングにおけるアプリケーション
package main import ( "fmt" "sync" "time" ) func main() { // 创建一个要并发执行的任务列表 tasks := []func(){ func() { fmt.Println("Task 1") }, func() { fmt.Println("Task 2") }, func() { fmt.Println("Task 3") }, } // 创建一个等待组以跟踪并发的任务 var wg sync.WaitGroup wg.Add(len(tasks)) // 创建一个通道来取消操作 cancel := make(chan struct{}) // 为每个任务创建一个闭包 for _, task := range tasks { go func(task func()) { defer wg.Done() select { case <-cancel: // 如果收到取消信号,则退出协程 return default: // 如果没有收到取消信号,则执行任务 task() } }(task) } // 等待所有任务完成 wg.Wait() fmt.Println("All tasks completed") // 发送取消信号以取消任何正在运行的协程 close(cancel) }
各タスクは、クロージャを通じて独自のコルーチンにカプセル化されます。クロージャは、キャンセル信号を受信したときに終了するために
メイン コルーチンは、
すべてのタスクが完了すると、メイン コルーチンは
チャネルをコルーチン間で安全に共有し、必要に応じて操作をキャンセルできるようにします。
以上が並行プログラミングにおける golang 関数クロージャの適用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。