go_ognl允许您在复杂结构下不解析结构的情况下,通过ognl表达式获取结构中的值。
- 使用方便,跟json parser一样方便;
- 不论是私有属性还是公有属性都可以访问;
- 支持层级展开,支持数组展开;
- 轻量级,无特殊依赖;
Ps: 实现依赖反射,结构转化会存在性能损耗
要在您的 Go 项目中使用 Go-OGNL,您需要先安装和设置好 Go 环境。然后,您可以使用以下 go get 命令进行安装:
go get github.com/golang-infrastructure/go-ognl
- 导入go_ognl
import "github.com/golang-infrastructure/go-ognl"
- 可以直接使用
go_ognl.Get(obj,path)
- 也可以直接调用parse方法,在此基础上可以实现多次调用or链式调用
parser := go_ognl.Parse(obj) parser.Get(path)
package main
import (
"fmt"
"github.com/golang-infrastructure/go-ognl"
)
type Test struct {
First string
Middle *Test
last int
}
func main() {
t1 := &Test{
First: "first",
last: 7,
}
t1.Middle = t1
fmt.Println(ognl.Get(t1, "First").Value()) // first
fmt.Println(ognl.Get(t1, "last").Value()) // 7
fmt.Println(ognl.Get(t1, "Middle.Middle.Middle.last").Value()) // 7
fmt.Println(ognl.Get(t1, "#").Value()) // []interface{}{"first",t1,7}
fmt.Println(ognl.Get(t1, "##").Value()) // []interface{}{"first","first",t1,7,7}
fmt.Println(ognl.Get(t1, "##").Values()) // []interface{}{"first","first",t1,7,7}
}
.
代表路径分隔符(Q: 那如果我的key就是带.
怎么办? A:使用\\
进行转义)#
表示当前层级进行展开操作,比如我是一个obj list,使用#
后的path针对每一个obj进行相同的操作
Get(value interface{}, path string) Result
GetE(value interface{}, path string) (Result, error)
GetMany(value interface{}, path ...string) []Result
Parse(result interface{}) Result
- Result.Effective() // 判断值是否有效
- Result.Type() // 获取值类型
- Result.Value() // 获取值
- Result.Values() // 获取值列表,如果是数组,则展开数组,如果是单个值,那么数组只会有一个
- Result.ValuesE() // 带有错误返回
- Result.Diagnosis() // 获取诊断信息
- Result.Get(path)
- Result.GetE(path) // 支持链式调用