Go context 全局变量参数

摘要1:

golang 上下文context用法详解 - 孙龙-程序员 - 博客园背景 在go服务器中,对于每个请求的request都是在单独的goroutine中进行的,处理一个request也可能设计多个goroutine之间的交互, 使用context可以使开发者方便的在这些https://www.cnblogs.com/sunlong88/p/11272559.html摘要2:

golang-context详解 - 知乎个人公众号『码农札记』,欢迎关注,查看更多精彩文章。 简介context.Context 是golang中独特的涉及,可以用来用来设置截止日期、同步信号,传递请求相关值的结构体。 与 Goroutine 有比较密切的关系。 在web程序中…https://zhuanlan.zhihu.com/p/266318909

WithValue示例:

设置上下文变量

pacake main

import (
    "context"
    "fmt"
)

func process(ctx context.Context) {
    ret, ok := ctx.Value("trace_id").(int)  // 类型断言
    if !ok {
        ret = 16464
    }
    fmt.Printf("ret:%d\n", ret)

    ret2, _ := ctx.Value("session").(string)  // 类型断言
    fmt.Printf("session:%d\n", ret2)
}

func main() {
    ctx := contxt.WithValue(context.Background(), "trace_id", 64448)
    // 继承ctx
    ctx = context.WithValue(ctx, "session", sdfsddsfdsfe)

    process(ctx)
}

WithTimeout示例:

设置函数超时时间

ctx, cancel := context.WithTimeout(context.Background(), time.Second)  // 超时时间为1秒
_, err = cli.put(ctx, "/logagent/conf", "sample_value")  // 操作etcd
cancel()  // 取消ctx

if err != nil {
    fmt.Println("put failed , err: ", err)
    return
}

WithCancel示例:

退出程序

示例1:

packge main

import (
    "fmt"
    "context"
)

func process() {
    gen := func(ctx context.Context) <-chan int {
        dst := make(chan int)
        n := 1
        go func() {
            for {
                select {
                    case <-ctx.Done():
                        fmt.Println("I exited")
                        return
                    case dst <- n:
                        n++
                }
            }
        }()
        return dst
    }

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()  // 程序退出之前执行

    for n := gen(ctx) {
        fmt.Println(n)
        if n == 5 {
            break  // 退出for循环
        }
    }
}

func main() {
    process()
}

示例2:

package main

import (
    "fmt"
)

func ReqTask(ctx context.Context, name string) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("game over", name)
            return

        default:
            fmt.Println("req task is runing", name)
            time.Sleep(time.Second)
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go ReqTask(ctx, "aaa")
    go ReqTask(ctx, "bbb")
    go ReqTask(ctx, "ccc")

    time.Sleep(time.Second*3)
    cancel() // 通知退出
    time.Sleep(time.Second*3)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Oracle 数据库中,可以使用包(package)或者会话(session)级别的上下文(context)来定义全局变量。 1. 使用包(package)定义全局变量: 首先,在包中声明一个变量,并将其设置为公共(public)的,这样其他包或过程可以访问它。然后,可以在包的任何过程或函数中使用该变量。 以下是一个示例代码: ```sql CREATE OR REPLACE PACKAGE my_package IS -- 声明一个全局变量 g_variable NUMBER; END my_package; / CREATE OR REPLACE PACKAGE BODY my_package IS -- 初始化全局变量 PROCEDURE init_variable IS BEGIN g_variable := 10; END init_variable; -- 使用全局变量 PROCEDURE use_variable IS BEGIN DBMS_OUTPUT.PUT_LINE(g_variable); END use_variable; END my_package; ``` 在上述示例中,"my_package" 包中声明了一个名为 "g_variable" 的全局变量,并在 "init_variable" 过程中初始化为 10。在 "use_variable" 过程中,可以访问并使用该全局变量。 2. 使用会话(session)级别的上下文(context)定义全局变量: Oracle 还提供了一种使用会话级别的上下文(context)来定义全局变量的方式。这种方式允许在会话内共享和访问全局变量,但对于其他会话来说是隔离的。 以下是一个示例代码: ```sql -- 创建上下文(context) CREATE OR REPLACE CONTEXT my_context USING my_package; -- 设置全局变量的值 EXECUTE IMMEDIATE 'BEGIN DBMS_SESSION.SET_CONTEXT(''my_context'', ''g_variable'', 10); END;'; -- 在过程中使用全局变量 CREATE OR REPLACE PROCEDURE use_variable IS v_variable NUMBER; BEGIN v_variable := SYS_CONTEXT('my_context', 'g_variable'); DBMS_OUTPUT.PUT_LINE(v_variable); END use_variable; ``` 在上述示例中,首先创建了一个名为 "my_context" 的上下文,其中使用了之前创建的包 "my_package"。然后,通过使用 `DBMS_SESSION.SET_CONTEXT` 过程,将全局变量 "g_variable" 的值设置为 10。最后,在过程 "use_variable" 中使用 `SYS_CONTEXT` 函数来获取并使用该全局变量的值。 这些是在 Oracle 数据库中定义全局变量的两种常见方法。根据具体的需求和场景选择适合的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值