设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

当Go遇上了Lua,会发生什么(5)

发布时间:2019-03-15 00:51 所属栏目:21 来源:Jiahonzheng
导读:在查阅相关博客后,我们可以对 Table 的 __newindex 方法的修改,将模块设置为只读模式。 packagemain import( fmt github.com/yuin/gopher-lua ) //设置表为只读 funcSetReadOnly(l*lua.LState,table*lua.LTable)*

在查阅相关博客后,我们可以对 Table 的 __newindex 方法的修改,将模块设置为只读模式。

  1. package main  
  2. import (  
  3.     "fmt"  
  4.     "github.com/yuin/gopher-lua"  
  5. )  
  6. // 设置表为只读  
  7. func SetReadOnly(l *lua.LState, table *lua.LTable) *lua.LUserData {  
  8.     ud := l.NewUserData()  
  9.     mt := l.NewTable()  
  10.     // 设置表中域的指向为 table  
  11.     l.SetField(mt, "__index", table)  
  12.     // 限制对表的更新操作  
  13.     l.SetField(mt, "__newindex", l.NewFunction(func(state *lua.LState) int {  
  14.         state.RaiseError("not allow to modify table")  
  15.         return 0  
  16.     }))  
  17.     ud.Metatable = mt  
  18.     return ud  
  19. }  
  20. func load(l *lua.LState) int {  
  21.     mod := l.SetFuncs(l.NewTable(), exports)  
  22.     l.SetField(mod, "name", lua.LString("gomodule"))  
  23.     // 设置只读  
  24.     l.Push(SetReadOnly(l, mod))  
  25.     return 1  
  26. }  
  27. var exports = map[string]lua.LGFunction{  
  28.     "goFunc": goFunc,  
  29. }  
  30. func goFunc(l *lua.LState) int {  
  31.     fmt.Println("golang")  
  32.     return 0  
  33. }  
  34. func main() {  
  35.     l := lua.NewState()  
  36.     l.PreloadModule("gomodule", load)  
  37.     // 尝试修改导入的模块  
  38.     if err := l.DoString(`local m = require("gomodule");m.name = "hello world"`); err != nil {  
  39.         fmt.Println(err)  
  40.     }  
  41.     l.Close()  
  42. }  
  43. // <string>:1: not allow to modify table 

写在最后

Golang 和 Lua 的融合,开阔了我的视野:原来静态语言和动态语言还能这么融合,静态语言的运行高效率,配合动态语言的开发高效率,想想都兴奋(逃。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读