首页 > 其他分享 >Golang context (上下文)是什么

Golang context (上下文)是什么

时间:2024-04-07 13:22:50浏览次数:26  
标签:WithValue ctx 节点 Golang context time 上下文 fmt

Golang context (上下文)是什么?

原创 几颗酥 几颗酥 2024-03-11 11:24 广西 1人听过

介绍

Context 是 golang 中十分重要的接口,用于定义 goroutine 中的上下文信息,context 常用于以下几种情况:

  • 数据传递:在多个 goroutine 中传递数据
  • 超时管理:通过配置超时时间,可以方便地配置协程的终止时间
  • 终止协程:通过使用 cancel() 方法,协程可以很方便地终止,可以批量管理多个协程的终止

Context 接口

// A Context carries a deadline, a cancelation signal, and other values across
// API boundaries.
//
// Context's methods may be called by multiple goroutines simultaneously.
type Context interface {

    Done() <-chan struct{}

    Deadline() (deadline time.Time, ok bool)
    
    Err() error
    
    Value(key interface{}) interface{}
}

根节点和派生节点

我们可以为 context 创建根节点和派生节点,为树形结构,当根节点被 cancel() 或超时终止时,它的所有派生节点也会被终止,根节点的数据也会被所有派生节点共享。

 

图片

创建根节点

ctx := context.Background() // 创建空白 context

ctx2 := context.TODO() // TODO 同样是空白 context

创建派生节点

使用 context.WithXXX() 创建派生 context

package main

import (
 "context"
 "fmt"
)

func main() {
 ctx := context.WithValue(context.Background(), "base", "baseVal")

 ctx1 := context.WithValue(ctx, "ctx1", "ctx1Val")
 ctx2 := context.WithValue(ctx, "ctx2", "ctx2Val")
 ctx3 := context.WithValue(ctx, "ctx3", "ctx3Val")

 fmt.Println(ctx)
 fmt.Println(ctx1)
 fmt.Println(ctx2)
 fmt.Println(ctx3)
}

// 结果:
// context.Background.WithValue(type string, val baseVal)
// context.Background.WithValue(type string, val baseVal).WithValue(type string, val ctx1Val)
// context.Background.WithValue(type string, val baseVal).WithValue(type string, val ctx2Val)
// context.Background.WithValue(type string, val baseVal).WithValue(type string, val ctx3Val)

WithValue()

context.WithValue() 可以用于创建派生节点并添加键值数据,同时保留父级 context 所有的数据

WithDeadline() WithTimeout()

context.WithDeadline() 和 context.WithTimeout() 可以用来创建带有超时控制的 context

WithTimeout(1*time.Second) 等同于 WithDeadline(time.Now().Add(1*time.Second))

package main

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

func main() {
 ctx, _ := context.WithTimeout(context.Background(), 3*time.Second)

 go func(ctx1 context.Context) {
  for {
   select {
   case <-ctx1.Done():
    fmt.Println("time out")
    return
   default:
    fmt.Println("running...")
    time.Sleep(time.Second)
   }
  }
 }(ctx)

 time.Sleep(5 * time.Second)
}

// 结果:
// running...
// running...
// running...
// time out

WithCancel()

使用 WithCancel() 可以创建手动终止的 context 执行 cancel() 即可手动终止

package main

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

func main() {
 ctx, cancel := context.WithCancel(context.Background())

 go func(ctx1 context.Context) {
  for {
   select {
   case <-ctx1.Done():
    fmt.Println("canceled")
    return
   default:
    fmt.Println("running...")
    time.Sleep(time.Second)
   }
  }
 }(ctx)

 time.Sleep(3*time.Second)
 cancel()
 time.Sleep(5 * time.Second)
}

// 结果:
// running...
// running...
// running...
// canceled

图片

图片

面试宝典8 面试宝典 · 目录 上一篇Golang channel (信道) 是什么? 阅读原文 阅读 284 几颗酥 ​ 喜欢此内容的人还喜欢   Simple Admin - Go 语言分布式后台管理系统 v1.3.11 更新     几颗酥 不看的原因   一文掌握 Golang Empty Struct 的所有用法     Go Official Blog 不看的原因   Golang 切片 (Slice) 教程     几颗酥 不看的原因   作者已设置关注7天后才可留言              

人划线

 

标签:WithValue,ctx,节点,Golang,context,time,上下文,fmt
From: https://www.cnblogs.com/cheyunhua/p/18118854

相关文章

  • Golang动态高效JSON解析技巧
    Golang动态高效JSON解析技巧原创 俞凡DeepNoMind DeepNoMind 2024-04-0614:57 上海 听全文JSON如今广泛用于配置和通信协议,但由于其定义的灵活性,很容易传递错误数据。本文介绍了如何使用mapstructure工具实现动态灵活的JSON数据解析,在牺牲一定性能的前提下,有效提......
  • Golang中的强大Web框架Fiber详解
    Golang 取消首页编程手机软件硬件安卓苹果手游教程平面服务器首页 > 脚本专栏 > Golang >Golang Web框架FiberGolang中的强大Web框架Fiber详解2023-10-2410:31:51 作者:技术的游戏在不断发展的Web开发领域中,选择正确的框架可以极大地影响项目的效......
  • Golang Context是什么
    一、这篇文章我们简要讨论Golang的Context有什么用1、首先说一下Context的基本作用,然后在讨论他的实现(1)数据传递,子Context只能看到自己的和父Context的数据,子Context是不能看到孙Context添加的数据。(2)父子协程的协同,比如同时取消父子协程。2、基本数据结构Context......
  • Golang和Java的对决:从设计理念到工具链的全面比较
    文章目录使用率排名Golang和Java设计理念语法和类型系统并发处理资源消耗生态系统和工具链结语使用率排名据最新的2024年3月Tiobe编程语言排行榜,目前Golang的使用率排名为第8呈上升趋势,Java的使用率排名为第4呈下降趋势2024年3月2023年3月排名变化编程语言......
  • 简单理解 React 的 createContext 和 Provider
    ......
  • golang 接口类型断言失败时,有哪些方式可以优雅地处理panic?
    在Go语言中,接口类型断言失败会导致运行时panic。为了避免程序因为类型断言失败而意外终止,可以采取以下几种优雅处理panic的方法:1.使用recover函数recover函数可以用来捕获panic,并从中恢复。这通常与defer语句一起使用。在进行类型断言的代码块之后,可以添加一......
  • golang反射与接口类型断言有什么区别?
    在Go语言中,反射(Reflection)和接口类型断言(InterfaceTypeAssertion)是两种不同的机制,它们各自有不同的用途和行为。以下是对它们的比较和区别的详细解释。反射(Reflection)反射是一种在运行时检查和操作程序内容的能力。在Go语言中,反射主要通过reflect包来实现。反射使......
  • golang和Java比较
    Golang(也被称为Go)和Java都是流行的编程语言,都有自己的优点和用途。下面是Golang和Java之间的一些比较。1、性能Golang被设计为一种高性能的语言,而Java的性能更加平均。Golang通过使用并发和轻量级线程(goroutines)来实现高性能,而Java使用线程(threads)来实现并发。Golang(Go)和Jav......
  • Golang实现一个聊天工具
    简介聊天工具作为实时通讯的必要工具,在现代互联网世界中扮演着重要的角色。本博客将指导如何使用Golang构建一个简单但功能完善的聊天工具,利用WebSocket技术实现即时通讯的功能。项目源码点击下载为什么选择GolangGolang是一种高效、简洁且并发性强的编程语言。......
  • 0x00 - golang开发环境搭建
    0x00-下载https://golang.google.cn/根据系统选择最近的版本即可。0x01-安装将0x00中下载的版本进行安装即可。最新版本的Go已经能将Go加入到环境变量中,无需个人配置。安装完毕后可以在terminal执行:(base)vth@vthdeMacBook-Pro~%goGoisatoolformanagingGoso......