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) ResultGetE(value interface{}, path string) (Result, error)GetMany(value interface{}, path ...string) []ResultParse(result interface{}) Result
- Result.Effective() // 判断值是否有效
 - Result.Type() // 获取值类型
 - Result.Value() // 获取值
 - Result.Values() // 获取值列表,如果是数组,则展开数组,如果是单个值,那么数组只会有一个
 - Result.ValuesE() // 带有错误返回
 - Result.Diagnosis() // 获取诊断信息
 - Result.Get(path)
 - Result.GetE(path) // 支持链式调用