gpt4 book ai didi

go - cel-go。如何使用自定义对象和时间戳比较

转载 作者:数据小太阳 更新时间:2023-10-29 03:46:20 38 4
gpt4 key购买 nike

我正在使用 Google/cel-go 库进行条件评估。这是我正在尝试完成的场景。我有一个结构说用户。它有一个 expirydate 字段,其中包含字符串时间戳。我想将其与当前系统时间戳进行比较。我正在尝试弄清楚如何使用 cel-go 做到这一点。有人可以帮忙吗。此外,我的用户结构中还有许多其他字段,可用于构造更多表达式。如何将我的结构用作输入以使用 user.fieldname 表示法

最佳答案

CEL是一种类似 C 的表达式语言,其中表达式只能引用宿主进程公开的变量、函数和宏。 CEL 提供内置函数库,您也可以提供自己的自定义函数。

给定以下表达式:

user.expirydate > now

宿主进程必须声明以下变量:

user // type DYN
now // type TIMESTAMP

所有运算符都在 CEL 中声明为函数,并且在给定表达式中支持哪些运算符是可自定义的。 > 运算符是标准内置函数之一,因此默认情况下可用。

以下是您可能如何解析、类型检查和评估示例的示例。类型检查是可选的,但强烈建议进行类型检查,因为它可以确保正确使用变量和函数。

vars := cel.Declarations(
decls.NewIdent('user', decls.Dyn, nil),
decls.NewIdent('now', decls.Timestamp, nil),
)
// The err and iss values should be checked, but for brevity the checks
// have been omitted.
env, err := cel.NewEnv(vars)
parsed, iss := env.Parse(`user.expirydate > now`)
ast, iss := env.Check(parsed)
program, err := env.Program(ast)

// The data is a map containing the desired fields.
// The result contains the outcome of evaluation.
result, details, err := program.Eval(data)

工作 Go Playground Example .

请注意,评估是无突变和无副作用的,这意味着扩展函数必须是幂等的。如果将 now 替换为函数 now(),则期望该函数的行为类似于惰性属性,它计算一次时间并在持续时间内返回相同的值的表达。

// now() must return the same value on both invocations.
user.expirydate > now() && user.expirydate < now() - duration('300s')

有关更详细的示例,我建议查看 google/cel-spec 中的一致性测试存储库和 godoc examples对于google/cel-go repo 。

关于go - cel-go。如何使用自定义对象和时间戳比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57589790/

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