golang lua使用示例

本文详细介绍了如何使用Gopher-Lua库在Go语言中调用Lua脚本,包括设置全局变量、操作table、注册Go函数到Lua环境以及从Lua文件加载字符串。通过具体代码示例展示了Go与Lua的无缝集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

import (
    "fmt"
    "github.com/yuin/gopher-lua"
)

func hello(L *lua.LState) int {
    inputparam :=  L.ToInt(1)
    fmt.Println("func hello get:",inputparam)

    //将返回参数压入栈中
    L.Push(lua.LString("hello"))
    //返回参数为1个
    return 1
}

func main() {
    L := lua.NewState()
    defer L.Close()

    //读写全局变量
    L.SetGlobal("Age",lua.LNumber(8))
    fmt.Println(L.GetGlobal("Age"))

    //生成一个带名字的table
    var t = L.NewTable()
    t.RawSetString("ID",lua.LNumber(110))
    t.RawSetString("Name",lua.LString("LULU"))
    L.SetGlobal("stu_table",t)


    //生成一个带名字的table2
    if err := L.DoString(`
    person = {
      name = "Michel",
      age  = "31", -- weakly input
      work_place = "San Jose",
      role = {
        {
          name = "Administrator"
        },
        {
          name = "Operator"
        }
      }
    }
    `); err != nil {
        panic(err)
    }

    //生成一个带名字的table3
    var t3 = L.NewTable()
    L.SetTable(t3,lua.LString("Height"),lua.LNumber(1009))
        L.SetGlobal("late",t3)

    //读取table中的所有数据1
    var r = L.GetGlobal("person")
    fmt.Println(r.Type())

    //读取table中的所有数据2
    fmt.Println(L.GetTable(r,lua.LString("work_place")))
    fmt.Println(L.GetTable(r,lua.LString("name")))

    //读取table中的所有数据3

    fmt.Println(L.GetField(r,"work_place"))
    fmt.Println(L.GetField(r,"name"))
    fmt.Println(L.Register)

    ////读取table中的所有数据4
    fmt.Println(L.GetTable(t3,lua.LString("Height")))


    //遍历读取table中的key,value
    //待补充

    //互相调用函数
    //注册go函数
    L.Register("hello",hello)

    // 生成一个lua函数
    err := L.DoString(`
        function info(n)
            ret = hello(n) 
            return ret
            
        end`)
    if err != nil{
        panic(err)
    }

    fn := L.GetGlobal("info")
    if err := L.CallByParam(lua.P{
        Fn: fn,
        NRet: 1,
        Protect: true,
    }, lua.LNumber(10)); err != nil {
        panic(err)
    }

    //这里获取函数返回值
    ret := L.Get(-1)
    fmt.Println(ret)


        //从lua文件中读取lua字符串
        err = L.DoFile("./test.lua")
        if err != nil{
            fmt.Println("err",err.Error())
            panic(err)
    }
    
    fmt.Println(L.GetGlobal("title"))

    title := L.GetGlobal("title")
    fmt.Println(reflect.TypeOf(title))
    fmt.Println(title)

    fmt.Println("Done!")
}

转载于:https://www.cnblogs.com/qianlicao/p/10792391.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值