濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > Golang中如何使用lua進(jìn)行擴(kuò)展詳解

Golang中如何使用lua進(jìn)行擴(kuò)展詳解

熱門標(biāo)簽:濱州自動(dòng)電銷機(jī)器人排名 黃岡人工智能電銷機(jī)器人哪個(gè)好 釘釘有地圖標(biāo)注功能嗎 汕頭小型外呼系統(tǒng) 浙江高頻外呼系統(tǒng)多少錢一個(gè)月 惠州電銷防封電話卡 阿里云ai電話機(jī)器人 鄭州亮點(diǎn)科技用的什么外呼系統(tǒng) 建造者2地圖標(biāo)注

前言

最近在項(xiàng)目中需要使用lua進(jìn)行擴(kuò)展,發(fā)現(xiàn)github上有一個(gè)用golang編寫的lua虛擬機(jī),名字叫做gopher-lua.使用后發(fā)現(xiàn)還不錯(cuò),借此分享給大家,下面話不多說了,來一起看看詳細(xì)的介紹吧。

數(shù)據(jù)類型

lua中的數(shù)據(jù)類型與golang中的數(shù)據(jù)類型對(duì)應(yīng)關(guān)系作者已經(jīng)在文檔中說明,值得注意的是類型是以L開頭的,類型的名稱是以LT開頭的.

golang中的數(shù)據(jù)轉(zhuǎn)換為lua中的數(shù)據(jù)就必須轉(zhuǎn)換為L開頭的類型:

str := "hello"
num := 10
L.LString(str)
L.LNumber(float64(num))

lua中的數(shù)據(jù)轉(zhuǎn)換為golang中的數(shù)據(jù),項(xiàng)目提供了ToInt,CheckString之類的函數(shù)來進(jìn)行轉(zhuǎn)換,但是這都是必須提前知道類型的,如果不知道就必須進(jìn)行類型判斷:

value := L.Get(1)
switch value.Type() {
case lua.LTString:
case lua.LTTable:
....
}

這里還可以使用gopher-luar來方便的進(jìn)行類型轉(zhuǎn)換.

golang和lua互相調(diào)用函數(shù)

golang中的函數(shù)必須轉(zhuǎn)換為func(L *lua.State) int這種形式才能注入lua中,返回參數(shù)的int代表了返回參數(shù)的個(gè)數(shù).

func hello(L *lua.State) int {
  //將返回參數(shù)壓入棧中
  L.Push(lua.LString("hello"))
  //返回參數(shù)為1個(gè)
  return 1
}
//注入lua中
L.SetGlobal("hello", L.NewFunction(hello))

在golang中調(diào)用lua函數(shù),lua腳本中需先定義這個(gè)函數(shù),然后調(diào)用CallByParam進(jìn)行調(diào)用:

//先獲取lua中定義的函數(shù)
fn := L.GetGlobal("hello")
if err := L.CallByParam(lua.P{
 Fn: fn,
 NRet: 1,
 Protect: true,
 }, lua.LNumber(10)); err != nil {
 panic(err)
}
//這里獲取函數(shù)返回值
ret := L.Get(-1)

Table

關(guān)于lua中的table是一個(gè)很強(qiáng)大的東西,項(xiàng)目對(duì)table也提供了很多方法的支持比如獲取一個(gè)字段,添加一個(gè)字段.這里推薦使用gluamapper,可以將tabl轉(zhuǎn)換為golang中的結(jié)構(gòu)體或者map[string]interface{}類型,這里使用了作者提供的例子:

type Role struct {
 Name string
}

type Person struct {
 Name  string
 Age  int
 WorkPlace string
 Role  []*Role
}

L := lua.NewState()
if err := L.DoString(`
person = {
 name = "Michel",
 age = "31", -- weakly input
 work_place = "San Jose",
 role = {
 {
  name = "Administrator"
 },
 {
  name = "Operator"
 }
 }
}
`); err != nil {
 panic(err)
}
var person Person
if err := gluamapper.Map(L.GetGlobal("person").(*lua.LTable), person); err != nil {
 panic(err)
}
fmt.Printf("%s %d", person.Name, person.Age)

模塊的加載與使用

項(xiàng)目中提供了lua基本模塊,調(diào)用OpenLibs就可以加載這些模塊,其中包括io,math,os,debug等.如果想自己加載可以使用SkipOpenLibs參數(shù)跳過.

如果想開發(fā)自己的庫,文檔中也做出了說明:

func Loader(L *lua.LState) int {
 //注冊模塊中的導(dǎo)出函數(shù)
 mod := L.SetFuncs(L.NewTable(), exports)
 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)

結(jié)語

當(dāng)然這里只簡單介紹了幾個(gè)基本的用法,項(xiàng)目還有一些不支持的地方,比如:package.loadlib.更多的地方等待讀者自己去探索,后面將會(huì)提供源代碼分析的文章.

好的,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • golang實(shí)現(xiàn)redis的延時(shí)消息隊(duì)列功能示例
  • 使用golang寫一個(gè)redis-cli的方法示例
  • 在Golang中使用Redis的方法示例
  • Golang使用lua腳本實(shí)現(xiàn)redis原子操作

標(biāo)簽:東營 滄州 瀘州 駐馬店 泰安 晉中 阿壩 昭通

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang中如何使用lua進(jìn)行擴(kuò)展詳解》,本文關(guān)鍵詞  Golang,中,如何,使用,lua,進(jìn)行,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang中如何使用lua進(jìn)行擴(kuò)展詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang中如何使用lua進(jìn)行擴(kuò)展詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    荣昌县| 合川市| 班戈县| 姜堰市| 银川市| 天等县| 壶关县| 巴林左旗| 阿克| 吉木萨尔县| 林州市| 香港 | 闽侯县| 灵宝市| 奉化市| 巴里| 福清市| 礼泉县| 武义县| 玉林市| 营口市| 莒南县| 驻马店市| 嘉善县| 呼图壁县| 尖扎县| 湘潭县| 黔江区| 长海县| 泸定县| 博野县| 宣武区| 泌阳县| 汉中市| 育儿| 清河县| 全南县| 石屏县| 商洛市| 页游| 阿坝|