非同期コールバックを実現する Go のネイティブな方法
Goroutineとチャネルを使用して、Go言語で非同期コールバックを実装できます。
まず、goroutine を使って非同期タスクを並行実行することができます。新しい goroutine を起動するには、関数呼び出しの前に go キーワードを追加します。例:
func asyncTask(callback func(result string)) {
// 异步任务逻辑
result := "异步任务结果"
// 执行回调函数
callback(result)
}
func main() {
// 启动异步任务
go asyncTask(func(result string) {
// 处理异步任务返回结果
fmt.Println(result)
})
// 继续执行其他逻辑
// ...
// 阻塞主goroutine
select {}
}
上記のコードにおいて、asyncTask関数は非同期タスクであり、引数としてコールバック関数を渡す。非同期タスクが完了すると、コールバック関数が呼び出され、結果が渡される。
メイン関数内で、goキーワードによって非同期タスクasyncTaskを実行するための新しいゴルーチンを起動しました。その後、他のロジックの実行を続行できます。メインゴルーチンの終了を防ぐため、selectステートメントでメインゴルーチンをブロックしました。
非同期タスク完了後にコールバック関数が呼び出され、その中で非同期タスクの戻り値を利用できるようになる。
ゴルーチン間の通信にはチャネルを用いることに注意してください。非同期タスクを呼び出すときにチャネルを渡すことで、非同期タスクが完了したときにその結果をチャネルに送信し、メインのゴルーチンでその結果を受け取るようにすることができます。例えば、
func asyncTask(callback chan string) {
// 异步任务逻辑
result := "异步任务结果"
// 发送结果到channel
callback <- result
}
func main() {
// 创建一个用于接收结果的channel
callback := make(chan string)
// 启动异步任务
go asyncTask(callback)
// 接收异步任务结果
result := <-callback
fmt.Println(result)
// 继续执行其他逻辑
// ...
}
この例では、結果の受け取り用のチャンネルを作成し、非同期タスク関数に渡しています。 非同期タスクが完了すると、<- 演算子を使用してチャンネルから結果を受け取り、それを印刷しています。
この方法は、より柔軟な非同期コールバックの実現を可能にし、コールバック関数で結果を処理したり、select 文を使用して複数の非同期タスクの結果を同時に待機したりすることができます。