在查阅相关博客后,我们可以对 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 的融合,开阔了我的视野:原来静态语言和动态语言还能这么融合,静态语言的运行高效率,配合动态语言的开发高效率,想想都兴奋(逃。 (编辑:广西网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|