Categorygithub.com/llyb120/goscript
repositorypackage
0.0.18
Repository: https://github.com/llyb120/goscript.git
Documentation: pkg.go.dev

# README

GoScript

GoScript 是一个用 Go 语言编写的Go脚本解释器。

快速上手

package main

func main() {
	interp := NewInterpreter()
    interp.Interpret(`print("Hello, World!")`)
}

语法

作为一个脚本语言,有其特定的应用场景

语法对go进行兼容,支持go的绝大部分语法,但在此基础上进行精简,与go的差异如下

  • 不支持switch语句
  • 不支持select语句
  • 不支持泛型
  • 不支持import语句
  • 不支持go func()
  • 不支持defer func()
  • 不支持定义struct
  • 不支持定义interface
  • 无空指针异常,即使使用未定义的变量也不会出错
  • 支持对go原生代码的桥接调用

与Go的互相调用

注册桥接函数

res, err := interp.BindFunction("print", print)
if err != nil {
    // do something
}
fmt.Println(res)

绑定桥接对象

// 绑定单一对象
interp.Set("x", 1)

// 绑定global对象
// 支持结构体和map
interp.SetGlobal(map[string]any{
    "x": 1,
    "y": func(s string) {
        fmt.Printf("fomat by y   %v \n", s)
    },
})

type test struct {
	X int
	Y func(string)
}

func (t *test) Bar() {
	fmt.Println("Bar")
}

interp.BindGlobalObject(test{
	X: 222,
	Y: func(s string) {
		fmt.Printf("fomat by y   %v \n", s)
	},
})

脚本中可以直接调用global对象上的属性,或者使用G关键字调用global对象

// script
a = a + 1 //will not panic
fmt.Println("hello" + a)
fmt.Println("world" + a.b)
var a strings.Builder
a.WriteString("hello")
print(a.String())

var b string
b = "hello" + "world"
print(b)

print("begin abc")
print(X)
print("bar")

Y("bar")

G.Bar()

yyy := func(a string){
	print("ok " + a)
}
yyy("foo")
mp := map[string]any{
	"x": 1,
	"y": 2,
}
mp = make(map[string]any)
mp["x"] = "foo"
yyy(mp.x)
mp["y"] = 4
mp.x = "foo jian"
var b = 1

yyy(mp.x)
	
sum := 0
j := 0
for j < 5 {
	print(j)
	j++
	if j > 2 {
		break	
	}
}
for i := 1; i <= 5; i++ {
	if i % 2 == 0 && 1 > 0 {
		sum += i * 2
		print(sum)
	} else {
		sum += i
		print(sum)
	}
}
return sum