一個go lua binding完工

  最近對go語言比較感興趣,想試用go來作點東西,go作主框架,動態加載一些程序來執行。因爲如今go語言不支持go模塊的動態連接,因此須要選用一個腳本語言來補充,找了一下,感受lua比較符合要求,虛擬機比較小,能夠同時開多個執行多個lua腳本。因而就找了一下go對lua的binding,找到golua,可是已經很久沒更新了,如今go1下編譯都通不過,修改了一下經過來,結果發現不能註冊go函數到lua中執行。。。框架

  不得已,就想本身寫一個,但願他能知足一下要求:函數

  1. 能夠將go函數註冊到lua中去,擴展lua的函數庫
  2. 能夠同時執行多個lua腳本
  3. 支持bool、int、float、string類型的相互轉換,其餘類型先不考慮
  以後又添加:
  1. 從go中調用lua中的函數
  2. 其餘類型都轉的lua中的userdate,只能傳回go中使用。
  3. 不定參數支持
  不過我對go和lua都是新手。。。因而看了很多go和lua的文檔,參考了golua和lua5.1的部分實現,終於寫完了,感受還不錯:

package main

import (
	"fmt"
	"glua"
)

type Int struct {
	I int
}

func NewInt() *Int {
	return &Int{10}
}

func (i Int) PrintInt(str string) {
	fmt.Println(str, i.I)
}

func main() {
	L := glua.NewState()
	
	L.Openlibs()

	var tlib = glua.Libfuncs{
		"gotest", // lib name
		map[string]interface{}{
			"NewInt":    NewInt,          // lua function name, go function
			"PrintInt":  (*Int).PrintInt, // lua function name, go function
			"goprintln": fmt.Println,
		},
	}
	if ok, err := L.Register(&tlib); !ok {
		fmt.Println(err.Error())
		return
	}
	
	L.Dostring(`gotest.PrintInt(gotest.NewInt(), "Int is")`) 

	L.Dofile("test.lua")
	
	L.Call("gotest.goprintln", "Call lua function.", 123456)
}

--test.lua
gotest.goprintln(true, 123, "lua", gotest.NewInt())



  在code.google.com/p/glua能夠看到所有代碼,編譯須要用luajit,由於lua5.1編譯出來是靜態庫,而go1不支持連接靜態庫,因此選用luajit了。
相關文章
相關標籤/搜索