十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶(hù) + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂(yōu)售后,網(wǎng)站問(wèn)題一站解決
github上有一個(gè)用golang編寫(xiě)的lua虛擬機(jī),名字叫做gopher-lua。
lua中的數(shù)據(jù)類(lèi)型與golang中的數(shù)據(jù)類(lèi)型對(duì)應(yīng)關(guān)系作者已經(jīng)在文檔中說(shuō)明,值得注意的是類(lèi)型是以L(fǎng)開(kāi)頭的,類(lèi)型的名稱(chēng)是以L(fǎng)T開(kāi)頭的。
golang中的數(shù)據(jù)轉(zhuǎn)換為lua中的數(shù)據(jù)就必須轉(zhuǎn)換為L(zhǎng)開(kāi)頭的類(lèi)型:
str := "hello" num := 10 L.LString(str) L.LNumber(float64(num))
lua中的數(shù)據(jù)轉(zhuǎn)換為golang中的數(shù)據(jù),項(xiàng)目提供了ToInt,CheckString之類(lèi)的函數(shù)來(lái)進(jìn)行轉(zhuǎn)換,但是這都是必須提前知道類(lèi)型的,如果不知道就必須進(jìn)行類(lèi)型判斷:
value := L.Get(1) switch value.Type() { case lua.LTString: case lua.LTTable: .... }
這里還可以使用gopher-luar來(lái)方便的進(jìn)行類(lèi)型轉(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)
以上就是golang lua怎么用的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司其它相關(guān)文章!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。