好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Golang中如何使用lua進行擴展詳解

Golang中如何使用lua進行擴展詳解

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

前言

最近在項目中需要使用lua進行擴展,發現github上有一個用golang編寫的lua虛擬機,名字叫做gopher-lua.使用后發現還不錯,借此分享給大家,下面話不多說了,來一起看看詳細的介紹吧。

數據類型

lua中的數據類型與golang中的數據類型對應關系作者已經在文檔中說明,值得注意的是類型是以L開頭的,類型的名稱是以LT開頭的.

golang中的數據轉換為lua中的數據就必須轉換為L開頭的類型:

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

lua中的數據轉換為golang中的數據,項目提供了ToInt,CheckString之類的函數來進行轉換,但是這都是必須提前知道類型的,如果不知道就必須進行類型判斷:

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

這里還可以使用gopher-luar來方便的進行類型轉換.

golang和lua互相調用函數

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

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

在golang中調用lua函數,lua腳本中需先定義這個函數,然后調用CallByParam進行調用:

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

Table

關于lua中的table是一個很強大的東西,項目對table也提供了很多方法的支持比如獲取一個字段,添加一個字段.這里推薦使用gluamapper,可以將tabl轉換為golang中的結構體或者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)

模塊的加載與使用

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

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

func Loader(L *lua.LState) int {
 //注冊模塊中的導出函數
 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)

結語

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

好的,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

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

標簽:東營 滄州 瀘州 駐馬店 泰安 晉中 阿壩 昭通

巨人網絡通訊聲明:本文標題《Golang中如何使用lua進行擴展詳解》,本文關鍵詞  Golang,中,如何,使用,lua,進行,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang中如何使用lua進行擴展詳解》相關的同類信息!
  • 本頁收集關于Golang中如何使用lua進行擴展詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产精品成人a?v久久A片小 | a天堂专区一区二区三区| 日韩一级完整毛片| 超级高h乱h| 张柏芝54张无删码艳照| 免费91麻豆精品国产自产在线观看| 亚洲女同制服中文字幕| 婬荡学院 (校园H)| a∨79成人网| 粉嫩虎白女18p| 欧美大交乱xxxxbbbb| 国产丰满老女人A片免费观看| 午夜无码人妻AV大片| 好大好长好爽| 岳?和女胥理论片| 16女学生小嫩嫩裸体自慰 | 好硬好湿好大好爽好紧深视频| 小受被狂c躁到高潮失禁作文| 国产A级AⅤ片在线观看| 两男一女3p叠罗汉两根一起进| jk美女扒开胸罩秘?露出奶| 99久久香蕉| 午夜a一级毛片| 幼儿园毕业爸爸寄语| 91中文字字幕乱码| gogo高清啪啪人体大胆摄影| www.51色??萝网站| 久久中文字幕日韩精品| 女攻男受调教室调教h| 久久久久久久久久一级| 国产精品欧美综合亚洲Avl| 男女无遮挡一进一出性视频| 5x性社区| 国产精品爽爽久久久天天躁漫画| 三级4级全黄在线看| 好紧好湿太硬了我太爽小说| AV污福利APP导航大全| 无码人妻一级毛片免费影院嫩草| 酒店自拍chinasexvideos| 大学生久久香蕉国产线看观看 | 露出羞耻大街裸露小说|