iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

Context

context包是Go語言的標準庫的一部分,提供了一種方法,用於傳遞上下文信息以及控制並發操作。

  • 取消操作:需要取消正在進行的操作,例如HTTP請求或數據庫查詢,context包可以優雅地取消這些操作,以防止資源浪費。

  • 超時處理:設置操作的超時時間,以確保操作不會無限期地等待,從而增加性能和可靠性。

  • 值的傳遞:在並發函數之間傳遞值,這對於在多個goroutine之間共享數據非常有用。

context.Background

要使用context包,首先需要創建一個上下文對象。這可以通過 context.Background 函數來實現,返回一個空的上下文對象,作為其他上下文的基礎。

package main

import (
	"context"
)

func main() {

	ctx := context.Background()
	ctx.Done()
}

context.WithTimeout

要設置操作的超時時間,可以使用 context.WithTimeout 函數,它將返回一個新的上下文對象,該對象在指定的時間內自動取消。

package main

import (
	"context"
	"time"
)

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel() // 確保在函數退出時取消上下文
	ctx.Done()
}

要取消上下文,可以宣告返回的cancel函數。這將通知所有使用該上下文的 goroutine 停止它們的工作。

傳遞值

context 包還允許你在 並發操作 之間傳遞值,以避免共享全局變量的競爭條件。

package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	ctx := context.WithValue(context.Background(), "key", "value")

	go func() {
		if v := ctx.Value("key"); v != nil {
			fmt.Println("Value:", v)
		}
	}()

	// 等待goroutine完成
	time.Sleep(time.Second)
}
Value: value

碎語

context 在並發環境中更容易處理超時、取消操作和值的傳遞。


上一篇
15 | simple middlweare
下一篇
17 | 簡化分散式系統
系列文
Go 語言學習手札30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言