| 在查阅相关博客后,我们可以对 Table 的 __newindex 方法的修改,将模块设置为只读模式。 package main  import (      "fmt"      "github.com/yuin/gopher-lua"  )  // 设置表为只读  func SetReadOnly(l *lua.LState, table *lua.LTable) *lua.LUserData {      ud := l.NewUserData()      mt := l.NewTable()      // 设置表中域的指向为 table      l.SetField(mt, "__index", table)      // 限制对表的更新操作      l.SetField(mt, "__newindex", l.NewFunction(func(state *lua.LState) int {          state.RaiseError("not allow to modify table")          return 0      }))      ud.Metatable = mt      return ud  }  func load(l *lua.LState) int {      mod := l.SetFuncs(l.NewTable(), exports)      l.SetField(mod, "name", lua.LString("gomodule"))      // 设置只读      l.Push(SetReadOnly(l, mod))      return 1  }  var exports = map[string]lua.LGFunction{      "goFunc": goFunc,  }  func goFunc(l *lua.LState) int {      fmt.Println("golang")      return 0  }  func main() {      l := lua.NewState()      l.PreloadModule("gomodule", load)      // 尝试修改导入的模块      if err := l.DoString(`local m = require("gomodule");m.name = "hello world"`); err != nil {          fmt.Println(err)      }      l.Close()  }  // <string>:1: not allow to modify table 
 写在最后 Golang 和 Lua 的融合,开阔了我的视野:原来静态语言和动态语言还能这么融合,静态语言的运行高效率,配合动态语言的开发高效率,想想都兴奋(逃。 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |