这篇文章主要介绍Golang中使用lua进行扩展的示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强>数据类型强>
lua中的数据类型与Golang中的数据类型对应关系作者已经在文档中说明,值得注意的是类型是以L开头的,类型的名称是以LT开头的。
golang中的数据转换为lua中的数据就必须转换为L开头的类型:
str :=,“hello" num :=10 L.LString (str) L.LNumber (float64 (num)
lua中的数据转换为golang中的数据,项目提供了ToInt, CheckString之类的函数来进行转换,但是这都是必须提前知道类型的,如果不知道就必须进行类型判断:
value :=, L.Get (1) switch value.Type (), { case lua.LTString: case lua.LTTable: … }
这里还可以使用gopher-luar来方便的进行类型转换。
<>强golang和lua互相调用函数强>
golang中的函数必须转换为func (L * lua.State) int这种形式才能注入lua中,返回参数的int代表了返回参数的个数。
func 你好(L * lua.State), int {//将才能返回参数压入栈中 L.Push才能(lua.LString (“hello"))//才能返回参数为1个 return 才能;1 }//注入lua中 L.SetGlobal (“hello", L.NewFunction(你好))
在golang中调用lua函数,lua脚本中需先定义这个函数,然后调用CallByParam进行调用:
//先获取lua中定义的函数 fn :=, L.GetGlobal (“hello") if err :=, L.CallByParam (lua.P { ,Fn: Fn, ,NRet: 1, ,保护:没错, ,},lua.LNumber (10));, err !=, nil { ,恐慌(err) }//这里获取函数返回值 ret :=, L.Get (1)
<强>表强>
关于lua中的表是一个很强大的东西,项目对表也提供了很多方法的支持比如获取一个字段,添加一个字段。这里推荐使用gluamapper,可以将tabl转换为golang中的结构体或者map [string]接口{}类型,这里使用了作者提供的例子:
type Role struct { Name 字符串 } type Person  struct { ,Name 字符串 ,Age int WorkPlace 字符串 ,Role [] *角色 } L :=, lua.NewState () if err :=, L.DoString (' person =, {=,name “Michel",=,age “31“,,,, weakly 输入=,work_place “San Jose" ,role =, { ,{ name =,才能“Administrator" }, ,{ name =,才能“Operator" ,} ,} } ”);,err !=, nil { ,恐慌(err) } var person 人 if err :=, gluamapper.Map (L.GetGlobal (“person")。(* lua.LTable),和人);,err !=, nil { ,恐慌(err) } fmt.Printf (“% s % d",, person.Name,, person.Age)
<强>模块的加载与使用
强>
项目中提供了lua基本模块,调用OpenLibs就可以加载这些模块,其中包括io,数学,操作系统,调试等。如果想自己加载可以使用SkipOpenLibs参数跳过。
如果想开发自己的库,文档中也做出了说明:
func 装载机(L * lua.LState), int { ,//注册模块中的导出函数 ,mod :=, L.SetFuncs (L.NewTable(),出口) ,L.Push (mod) return 1 } var exports =, map [string] lua.LGFunction { ,“myfunc": myfunc, } func myfunc (L * lua.LState), int { return 0 }//这里就可以加载mymodule里模块 L.PreloadModule (“mymodule", mymodule.Loader)
以上是“Golang中使用lua进行扩展的示例”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!