当前位置: 首页 > news >正文

建立什么网站赚钱厦门建设局官网电话

建立什么网站赚钱,厦门建设局官网电话,我要学做网站,中国建设银行幼儿缴费官网站文章目录 前言核心是 Context 接口#xff1a;包含四个方法#xff1a;遵循规则WithCancelWithDeadlineWithTimeoutWithValue 前言 很多 Go 项目的源码#xff0c;在读的过程中会发现一个很常见的参数 ctx#xff0c;而且基本都是作为函数的第一个参数。 为什么要这么写呢… 文章目录 前言核心是 Context 接口包含四个方法遵循规则WithCancelWithDeadlineWithTimeoutWithValue 前言 很多 Go 项目的源码在读的过程中会发现一个很常见的参数 ctx而且基本都是作为函数的第一个参数。 为什么要这么写呢这个参数到底有什么用呢带着这样的疑问我研究了这个参数背后的故事。 开局一张图 核心是 Context 接口 // A Context carries a deadline, cancelation signal, and request-scoped values // across API boundaries. Its methods are safe for simultaneous use by multiple // goroutines. type Context interface {// Done returns a channel that is closed when this Context is canceled// or times out.Done() -chan struct{}// Err indicates why this context was canceled, after the Done channel// is closed.Err() error// Deadline returns the time when this Context will be canceled, if any.Deadline() (deadline time.Time, ok bool)// Value returns the value associated with key or nil if none.Value(key interface{}) interface{} }包含四个方法 Done()返回一个 channel当 times out 或者调用 cancel 方法时。Err()返回一个错误表示取消 ctx 的原因。Deadline()返回截止时间和一个 bool 值。Value()返回 key 对应的值。 有四个结构体实现了这个接口分别是emptyCtx, cancelCtx, timerCtx 和 valueCtx。 其中 emptyCtx 是空类型暴露了两个方法 func Background() Context func TODO() Context一般情况下会使用 Background() 作为根 ctx然后在其基础上再派生出子 ctx。要是不确定使用哪个 ctx就使用 TODO()。 另外三个也分别暴露了对应的方法 func WithCancel(parent Context) (ctx Context, cancel CancelFunc) func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) func WithValue(parent Context, key, val interface{}) Context遵循规则 在使用 Context 时要遵循以下四点规则 不要将 Context 放入结构体而是应该作为第一个参数传入命名为 ctx。即使函数允许也不要传入 nil 的 Context。如果不知道用哪种 Context可以使用 context.TODO()。使用 Context 的 Value 相关方法只应该用于在程序和接口中传递和请求相关的元数据不要用它来传递一些可选的参数。相同的 Context 可以传递给不同的 goroutineContext 是并发安全的。 WithCancel go复制代码func WithCancel(parent Context) (ctx Context, cancel CancelFunc) WithCancel 返回带有新 Done 通道的父级副本。当调用返回的 cancel 函数或关闭父上下文的 Done 通道时返回的 ctx 的 Done 通道将关闭。 取消此上下文会释放与其关联的资源因此在此上下文中运行的操作完成后代码应立即调用 cancel。 举个例子 这段代码演示了如何使用可取消上下文来防止 goroutine 泄漏。在函数结束时由 gen 启动的 goroutine 将返回而不会泄漏。 package mainimport (contextfmt )func main() {// gen generates integers in a separate goroutine and// sends them to the returned channel.// The callers of gen need to cancel the context once// they are done consuming generated integers not to leak// the internal goroutine started by gen.gen : func(ctx context.Context) -chan int {dst : make(chan int)n : 1go func() {for {select {case -ctx.Done():return // returning not to leak the goroutinecase dst - n:n}}}()return dst}ctx, cancel : context.WithCancel(context.Background())defer cancel() // cancel when we are finished consuming integersfor n : range gen(ctx) {fmt.Println(n)if n 5 {break}} }输出 2 3 4 5WithDeadline func WithDeadline(parent Context, d time.Time) (Context, CancelFunc)WithDeadline 返回父上下文的副本并将截止日期调整为不晚于 d。如果父级的截止日期已经早于 d则 WithDeadline(parent, d) 在语义上等同于 parent。 当截止时间到期、调用返回的取消函数时或当父上下文的 Done 通道关闭时返回的上下文的 Done 通道将关闭。 取消此上下文会释放与其关联的资源因此在此上下文中运行的操作完成后代码应立即调用取消。 举个例子 这段代码传递具有截止时间的上下文来告诉阻塞函数它应该在到达截止时间时立刻退出。 package mainimport (contextfmttime )const shortDuration 1 * time.Millisecondfunc main() {d : time.Now().Add(shortDuration)ctx, cancel : context.WithDeadline(context.Background(), d)// Even though ctx will be expired, it is good practice to call its// cancellation function in any case. Failure to do so may keep the// context and its parent alive longer than necessary.defer cancel()select {case -time.After(1 * time.Second):fmt.Println(overslept)case -ctx.Done():fmt.Println(ctx.Err())} }输出 context deadline exceededWithTimeout func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)WithTimeout 返回 WithDeadline(parent, time.Now().Add(timeout))。 取消此上下文会释放与其关联的资源因此在此上下文中运行的操作完成后代码应立即调用取消。 举个例子 这段代码传递带有超时的上下文以告诉阻塞函数应在超时后退出。 package mainimport (contextfmttime )const shortDuration 1 * time.Millisecondfunc main() {// Pass a context with a timeout to tell a blocking function that it// should abandon its work after the timeout elapses.ctx, cancel : context.WithTimeout(context.Background(), shortDuration)defer cancel()select {case -time.After(1 * time.Second):fmt.Println(overslept)case -ctx.Done():fmt.Println(ctx.Err()) // prints context deadline exceeded}}输出 context deadline exceededWithValue func WithValue(parent Context, key, val any) ContextWithValue 返回父级的副本其中与 key 关联的值为 val。 其中键必须是可比较的并且不应是字符串类型或任何其他内置类型以避免使用上下文的包之间发生冲突。 WithValue 的用户应该定义自己的键类型。 为了避免分配给 interface{}上下文键通常具有具体的 struct{} 类型。或者导出的上下文键变量的静态类型应该是指针或接口。 举个例子 这段代码演示了如何将值传递到上下文以及如何检索它如果存在。 package mainimport (contextfmt )func main() {type favContextKey stringf : func(ctx context.Context, k favContextKey) {if v : ctx.Value(k); v ! nil {fmt.Println(found value:, v)return}fmt.Println(key not found:, k)}k : favContextKey(language)ctx : context.WithValue(context.Background(), k, Go)f(ctx, k)f(ctx, favContextKey(color)) }输出 ound value: Go key not found: color本文的大部分内容包括代码示例都是翻译自官方文档代码都是经过验证可以执行的。如果有不是特别清晰的地方可以直接去读官方文档。
http://www.hkea.cn/news/14522798/

相关文章:

  • 花瓣网设计网站衣服品牌logo大全
  • 站长统计app下载免费网站建设哪家比较好
  • 做网站的多钱wordpress 生成app
  • 自助建站系中山市网站建设
  • 自己的网站没有域名南宁做网站 的
  • 顺德网站站长之家网页模板下载
  • 如何进行网站的推广成都企业如何建网站
  • 汕头网站建设推荐温州网站的优化
  • 丰台网站制作浩森宇特广州安全教育平台官网
  • 昆明网站建设开发制作江西网站做的好的企业
  • 网站建设规划方案ppt模板广告制作单位
  • 免费网站源码模板下载郑州网站外包哪家好
  • 自己做的网站图片不显示网络营销推广有效方式
  • 新思维网站罗湖网站建设 信科网络
  • 简述网站开发的基本流程图wordpress建站 网盘视频教程
  • 网站建设2000字论文免费自助建站全系统
  • 上海网站建设 找思创网络互联网创业就是做网站吗
  • 如何创建自己的网站平台大数据营销的缺点
  • 安卓网站开发ui南京市建设工程交易中心
  • thinkphp企业网站开发浦东建设网站
  • 如何开发cms网站WordPress偷模板
  • 广西专业网站建设网络规划设计师资料
  • 资源网站快速优化排名oss wordpress
  • 做服装团购有哪些网站切图做网站过时了吗
  • 网站降权了怎么办wordpress主题没有评论
  • 网站可以有二维码吗建设项目银行网站
  • 做电影网站需要什么服务器中国万网注册网站
  • 威县做网站哪里好个人网站建设计划表
  • 凡科网站怎么做授权查询说明多媒体教学网站开发的一般步骤
  • 半岛网自助建站优化排名