上下文中的值不能在不同的包中传输吗?

时间:2018-10-16 09:08:19

标签: go

今天我尝试使用上下文编程,代码如下:

package main

func main(){
  ctx := context.Background()
  ctx = context.WithValue(ctx,"appid","test111")
  b.dosomething()
}


package b

func dosomething(ctx context.Context){
    fmt.Println(ctx.Value("appid").(string))
} 

然后我的程序崩溃了,我认为是因为这些ctx位于不同的程序包中

1 个答案:

答案 0 :(得分:0)

我建议您仅在单个任务的生存期内使用上下文,并通过函数传递相同的上下文。 此外,您还应该了解在何处使用上下文以及仅在何处传递参数给函数。

另一个建议是使用自定义类型来设置上下文并从上下文中获取值。

根据上述所有内容,您的程序应如下所示:

package main

import (
    "context"
    "fmt"
)

type KeyMsg string

func main() {
    ctx := context.WithValue(context.Background(), KeyMsg("msg"), "hello")
    DoSomething(ctx)
}

// DoSomething accepts context value, retrieves message by KeyMsg and prints it.
func DoSomething(ctx context.Context) {
    msg, ok := ctx.Value(KeyMsg("msg")).(string)
    if !ok {
        return
    }

    fmt.Println("got msg:", msg)
}

您可以将DoSomething函数移至另一个程序包中,并将其称为程序包名称。DoSomething不会改变任何内容。