9.4.13 الگو Future

9.4.13 الگو Future

9.4.13.1 توضیحات #

در زبان گو الگو Future راهی برای نمایش نتیجه یک عملیات ناهمزمان (asynchronous) است که ممکن است آن عملیات هنوز تکمیل نشده باشد اما این الگو به شما این امکان را می دهد کدی بنویسید که طوری رفتار کند که گویی نتیجه یک عملیات فورا در دسترس است. حتی اگر عملیات در پس زمینه در حال اجرا باشد.

9.4.13.2 دیاگرام #

9.4.13.3 نمونه کد #

 1package main
 2
 3import (
 4	"fmt"
 5	"time"
 6)
 7
 8type FutureInt struct {
 9	result chan int
10}
11
12func (f *FutureInt) Get() int {
13	return <-f.result
14}
15
16func longRunningTask() *FutureInt {
17	f := &FutureInt{result: make(chan int)}
18	go func() {
19		time.Sleep(time.Second)
20		f.result <- 42
21	}()
22	return f
23}
24
25func main() {
26	f := longRunningTask()
27	// Do other things
28	fmt.Println("The answer is:", f.Get())
29}
1$ go run main.go
2The answer is: 42

در کد فوق ما یک تابع به نام longRunningTask داریم که یک تسک زمانبر را انجام می دهد و در نهایت ساختار FutureInt را بازمیگرداند و نتیجه را داخل فیلد result بواسطه کانال میریزد. حال داخل تابع main یک متغیر f ایجاد کردیم و تابع longRunningTask را داخلش قرار دادیم و پس از آن متد Get را فراخوانی کردیم.

حال اگر تسک داخل تابع longRunningTask تمام شود و مقدار را داخل کانال result بفرستد ما می توانید مقدار را از طریق متد Get دریافت کنیم و البته تا زمانیکه تسک داخل تابع longRunningTask تمام شود.

9.4.13.4 کاربردها #

  • درخواست های شبکه: هنگام ایجاد درخواست های شبکه، استفاده از الگوی Future برای نمایش نتیجه درخواست می تواند مفید باشد.
  • کوئری های پایگاه داده: هنگام کوئری از پایگاه داده، می توانید از الگوی Future برای نمایش نتیجه کوئری استفاده کنید. این به شما امکان می دهد کدی بنویسید که به گونه ای رفتار کند که گویی نتیجه بلافاصله در دسترس است، حتی اگر تکمیل کوئری ممکن است کمی طول بکشد.