如何在 Golang 函数中传递上下文信息?

golang 中可以使用 context 包来传递上下文信息:使用 context.background() 创建一个新的上下文。使用 context.withvalue() 将值添加到上下文中。使用 ctx.value() 获取上下文中存储的值。

如何在 Golang 函数中传递上下文信息?

在并发程序中传递上下文信息至关重要,它允许在不同 goroutine 中访问共享数据。这对于日志记录、追踪、错误处理和传递中间数据很有用。

使用 Context 包

Go 标准库提供了一个 context 包,它提供了用于管理上下文信息的类型和函数。

要创建一个新的 context.Context,请使用 conte项目网点我wcqh.cnxt.Background():

立即学习go语言免费学习笔记(深入)”;

1

ctx := context.Background()

登录后复制

您可以使用 context.WithValue() 将值添加到上下文中:

1

ctx = context.WithValue(ctx, “key”, “value”)

登录后复制

您可以在任何地方获取上下文中存储的值:

1

value := ctx.Value(“key”)

登录后复制

实战案例

假设我们有一个 goroutine池,它执行并行任务。我们要在每个 goroutine 中记录任务的开始和结束时间。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

2项目网点我wcqh.cn1

22

23

24

25

26

27

28

29

30

31

32

33

34

package main

import (

“context”

“fmt”

“time”

)

func main() {

ctx, cancel := context.WithCancel(context.Background())

defer cancel()

// 创建 goroutine 池

pool := make(chan func())

for i := 0; i < 10; i++ {

go func(ctx context.Context, i int) {

fmt.Println(“Task”, i, “started”)

// 这里我们使用了上下文项目网点我wcqh.cn里的时间戳来计算任务耗时

start := time.Now()

ctx = context.WithValue(ctx, “start”, start)

// 模拟任务执行

time.Sleep(time.Second)

// 获取任务开始时间并计算耗时

start = ctx.Value(“start”).(time.Time)

fmt.Printf(“Task %d ended, took %v\n”, i, time.Since(start))

}(ctx, i)

pool <- nil

}

close(pool)

time.Sleep(5 * time.Second)

}

登录后复制

在此示例中,我们使用 con项目网点我wcqh.cntext.WithValue() 将 start 时间戳添加到上下文中。然后,在 goroutine 中,我们可以通过 ctx.Value() 获取开始时间戳,并计算任务的耗时。

注意事项

垃圾回收会清理上下文对象,因此确保在需要时进行传递。 不要将引用对象存储在上下文中,因为它可能会导致内存泄漏。 避免在多个 goroutine 中写入相同的上下文,因为这可能会导致竞争条件。

以上就是如何在 Golang 函数中传递上下文信息?的详细内容,更多请关注青狐资源网其它相关文章!

© 版权声明
THE END
喜欢就支持一下吧
点赞556 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容