Golang里的Future/Promise
时间: 2024-01-02 07:02:08 浏览: 232
golang数据库/ sql的通用扩展-Golang开发
在 Golang 中,Future 和 Promise 的概念通常被称为 Channel。Channel 是一种用于在 Goroutine 之间进行通信和同步的机制,类似于 Unix 系统中的管道。Future 和 Promise 的概念可以通过 Channel 来实现。
Future 是一个表示异步操作结果的对象,它可以让你在不阻塞当前线程的情况下等待异步操作完成。在 Golang 中,可以使用一个带缓冲的 Channel 来实现 Future。当异步操作完成时,会向 Channel 中写入结果,而 Future 对象会等待 Channel 中有数据可读。
例如,下面的代码演示了如何使用 Channel 实现 Future:
```
func asyncOperation() <-chan int {
result := make(chan int, 1)
go func() {
// 异步操作
time.Sleep(time.Second)
result <- 42
}()
return result
}
func main() {
// 启动异步操作
future := asyncOperation()
// 在不阻塞当前线程的情况下等待异步操作完成
fmt.Println("Waiting for async operation...")
value := <-future
fmt.Printf("Async operation completed with result: %d\n", value)
}
```
Promise 是一个表示异步操作的未来结果的对象,它可以让你在异步操作完成之前先返回一个对象,然后在异步操作完成之后再向该对象写入结果。在 Golang 中,可以使用一个未缓冲的 Channel 来实现 Promise。当异步操作完成时,会向 Channel 中写入结果,而 Promise 对象在等待 Channel 可写时会被阻塞。
例如,下面的代码演示了如何使用 Channel 实现 Promise:
```
type Promise struct {
result chan int
}
func asyncOperation() *Promise {
promise := &Promise{make(chan int)}
go func() {
// 异步操作
time.Sleep(time.Second)
promise.result <- 42
}()
return promise
}
func main() {
// 启动异步操作
promise := asyncOperation()
// 在异步操作完成之前先返回一个对象
fmt.Println("Async operation started...")
// 在异步操作完成之后再获取结果
value := <-promise.result
fmt.Printf("Async operation completed with result: %d\n", value)
}
```
阅读全文