首页 > 其他分享 >GoLang Context

GoLang Context

时间:2022-10-05 19:00:27浏览次数:43  
标签:Context doSomething ctx GoLang context doAnother 函数

GoLang Context

介绍

在开发大型应用是,尤其是服务器软件中,有时除了函数自身工作所需的信息之外,了解更多关于它正在执行的环境的信息是有帮助的。例如,web服务器器函数正在处理特定客户端的HTTP请求,则该函数可能只需要知道客户端请求那个URL来提供相应。该函数可能只将该url作为参数,但在服务请求的过程中难免会发生一些意外,例如在客户端收到响应之前断开连接。如果提供相应的函数不知道客户端已断开连接,则服务器软件最终可能会花费比我们期望的时间还要长的时间

在这种情况下,可以通过判断服务端的连接状态,实现服务器在客户端断开后终止掉该连接,可以保证在繁忙的服务器中节省掉部分资源,对u有数据库的连接也同样适用。

这里会首先创建一个在函数中是用上下文的Go程序,然后更新该程序在Context中存储的数据并在另外一个函数中检索它,最后,使用Context完成部分停止的操作

创建上下文

Go中的需要包中都会是用Context,将这些变量作为参数或直接的函数可以是用该变量获取他们正在执行的环境相关的附加信息,一般是在main函数开始创建Context,一直到最下层的函数调用,通过将context的值传递到一个函数中,在sql.DB中调用QueryContext,这样就实现了当客户端断开连接时停止还在运行的会话

这里我们会先介绍两种比较简单的context,context.TODOcontext.BackGroup

将会创建一个context,然后在函数dosomething中是用这个参数

package main
import (
	"context"
	"fmt"
)

func doSomething(ctx context.Context){
    fmt.Println("Do something")
}

func main() {
    ctx := context.TODO()
    doSomething(ctx)
}
Output
Doing something!

main函数中,创建了ctx并在doSomething中传入了这个参数,是用context.TODO的意思是创建一个空的context.Context,通常用于你不太清楚流程中是否需要context时。

上面实际上只传递了这个ctx的参数,并没有实际是用这个值,并且它是作为函数的第一个参数,名字叫做ctx,标准库中也是这么使用的

当然也可以是用context.Background这个也是空的,和context.TODO是一样功能

下面会介绍一些更加复杂的context用于实际使用中

携带数据的context

使用context.WithValue禁止赋值,该函数返回一个新的context,使用ctx.Value("key")获取存储的数据

func doSomething(ctx context.Context) {
	fmt.Printf("doSomething: myKey's value is %s\n", ctx.Value("myKey"))
}

func main() {
	ctx := context.Background()

	ctx = context.WithValue(ctx, "myKey", "myValue")

	doSomething(ctx)
}
Output
doSomething: myKey's value is myValue

结束一个context

对于需要考虑到何时结束和完成的场景,context能被以信号的形式使用。通过标识context已经完成,我们知道合适停止对应的函数执行

package main

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

func doSomething(ctx context.Context) {
	ctx, cancelCtx := context.WithCancel(ctx)
	
	printCh := make(chan int)
	go doAnother(ctx, printCh)

	for num := 1; num <= 3; num++ {
		printCh <- num
	}

	cancelCtx()

	time.Sleep(100 * time.Millisecond)

	fmt.Printf("doSomething: finished\n")
}

func doAnother(ctx context.Context, printCh <-chan int) {
	for {
		select {
		case <-ctx.Done():
			if err := ctx.Err(); err != nil {
				fmt.Printf("doAnother err: %s\n", err)
			}
			fmt.Printf("doAnother: finished\n")
			return
		case num := <-printCh:
			fmt.Printf("doAnother: %d\n", num)
		}
	}
}

Output
doAnother: 1
doAnother: 2
doAnother: 3
doAnother err: context canceled
doAnother: finished
doSomething: finished

其他的方法比如说context.WithDeadLine``WithTimeOut

总结

本文中,样例中介绍了context包的几种使用方式,首先创建一个能够接受context.Context的函数,使用context.TODO,context.Backgroupd来创建对应的空的 context,使用context.WithValue天骄不同的值到context中,使用Value函数来获取他们,最后使用context.Done()这个channle来判断ctx是否完成,对应的函数包括WithCancel,WithDeadline,WithTimeOut三个函数

标签:Context,doSomething,ctx,GoLang,context,doAnother,函数
From: https://www.cnblogs.com/Heliner/p/16756136.html

相关文章

  • golang中map基础了解
    map初识map是一个以键值对元素的数据集合,map是一个集合。map的优点是查找速度非常会,原因是map的底层存储是hash表。hash表的存储原理:对key进行计算,计算出hash值,对hash......
  • ContextCapture-硬件配置推荐
    ContextCapture倾斜摄影的空三计算、三维建模应用。非常耗费硬件资源,适当调整硬件配置,可以显著提高模型处理时间。硬件常见问题随着倾斜摄影建模算法成熟,应用越来越广泛,......
  • golang channel底层结构和实现
    一、介绍Golang设计模式:不要通过共享内存来通信,而要通过通信实现内存共享channel是基于通信顺序模型(communicationsequentialprocesses,CSP)的并发模式,可以让一......
  • golang GC原理
    一、堆栈栈(heap):由操作系统自动分配释放。一般函数内部执行中声明的变量,函数返回时直接释放,不会引起垃圾回收,对性能无影响堆(stack):一般由程序员分配释放,若程序......
  • spring:beanfactory与applicationcontext的设计
    beanfactory接口提供的方法:getBean,getBeanProvider,containsBean,isSingleton,getType,getAliaseslistableBeanFactory:不会取到手动注册的bean,为什么要这么做呢,因为有些bea......
  • 前端程序员学习 Golang gin 框架实战笔记之一开始玩 gin
    原文链接我是一名五六年经验的前端程序员,现在准备学习一下Golang的后端框架gin。以下是我的学习实战经验,记录下来,供大家参考。https://github.com/gin-gonic/gin1.......
  • 【Golang】go语言中如何控制goroutine的数量
    一、现状在Go语言中,goroutine的创建成本很低,调度效率高,Go语言在设计时就是按以数万个goroutine为规范进行设计的,数十万个并不意外,但是goroutine在内存占用方面确实具有有......
  • 关于 SAP UI5 ODataModel.createEntry 返回的 context 对象
    在返回的上下文中使用创建的API返回的Promise对象,以便在持久化或重置时获得通知。使用isTransientAPI,您可以确定创建的上下文是transient的还是持久的;请注意,对于尚......
  • Golang:输出Emoji表情符号
    Emojiisasimplegolangpackage.译文:Emoji是一个简单的golang包。文档​​https://github.com/kyokomi/emoji​​​​https://pkg.go.dev/github.com/kyokomi/emoji/v2​......
  • Golang:第七章 Golang 常量
    常量:程序编译阶段就确定下来的值,程序运行时无法改变该值定义常量//定义的时候就要初始化constconstantName[type]=valueeg:constPIfloat32=3.14//简写......