gpt4 book ai didi

google-app-engine - 如何使用 Go 获取当前命名空间和 App Engine 延迟函数?

转载 作者:IT王子 更新时间:2023-10-29 02:13:07 25 4
gpt4 key购买 nike

如果我设置 context.Context 的命名空间并调用延迟函数:

ctx := appengine.NewContext(r)
ctx, err := appengine.Namespace(ctx, "mynamespace")

delayFunc.Call(ctx)

如何找到它的名字:

var delayFunc = delay.Func("my-func", func(ctx context.Context) {
// How do I extract "mynamespace" from ctx?
})

以下是可接受的做法吗?

var delayFunc = delay.Func("my-func", func(ctx context.Context) {
n := datastore.NewKey(ctx, "E", "e", 0, nil).Namespace()
// n == "mynamespace"
})

它可以工作,但感觉就像一个 hack。

最佳答案

不幸的是你运气不好。 Appengine 不提供(导出的)API 调用来访问与上下文关联的命名空间。

命名空间与上下文的关联由 appengine/internal 处理包,但是“程序不应该直接使用这个包”。带有命名空间的上下文由 internal.NamespacedContext() 获得调用,并且在 internal.NamespaceFromContext() 中实现了从上下文中“提取”的命名空间.这些不是公共(public) API 的一部分,因此您不能(不应该)使用它们。

您基本上有 2 个选择。一种是您展示的“hacky”方式,它很有效,您可以继续使用它。

另一种是手动处理,例如通过使用您自己的 key 手动将命名空间放入上下文中,例如:

var namespaceKey = "myNsKey"


ctx = context.WithValue(ctx, namespaceKey, "mynamespace")

当您需要它时,您可以像这样获取它:

ns := ctx.Value(namespaceKey)

是的,这有必须手动更新的负担,如果您忘记了,您会得到一个“无效”或空的命名空间。因此,就我个人而言,我现在会采用您的“hacky”方式(直到此功能被添加到公共(public) API 中,如果有的话)。

如果您采用手动方式,为了摆脱“风险”因素,您可以创建一个辅助函数来处理这个问题以及 appengine.Namespace()打电话,这样你就不会忘记它,而且它会很安全。它可能看起来像这样:

func SetNS(ctx context.Context, ns string) context.Context {
ctx = ctx, err := appengine.Namespace(ctx, ns)
if err != nil {
// handle error
}
ctx = context.WithValue(ctx, namespaceKey, ns)
return ctx
}

并使用它:

ctx = SetNS(ctx, "mynamespace")

但是,当您需要从上下文访问命名空间时,这种情况可能很少见,因为当您需要它时,将上下文传递给适当的 (Appengine) API 调用可能就足够了,后者可以从上下文。

关于google-app-engine - 如何使用 Go 获取当前命名空间和 App Engine 延迟函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39934978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com