A fast script language for Go
Tengo is a small, dynamic, fast, secure script language for Go.
Tengo is fast and secure because it's compiled/executed as bytecode on stack-based VM that's written in native Go.
/* The Tengo Language */
fmt := import("fmt")
each := func(seq, fn) {
for x in seq { fn(x) }
}
sum := func(init, seq) {
each(seq, func(x) { init += x })
return init
}
fmt.println(sum(0, [1, 2, 3])) // "6"
fmt.println(sum("", [1, 2, 3])) // "123"
Test this Tengo code in the Tengo Playground
2,315ms
3ms
Tengo (VM)
go-lua
4,028ms
3ms
Lua (VM)
GopherLua
4,409ms
3ms
Lua (VM)
goja
5,194ms
4ms
JavaScript (VM)
starlark-go
6,954ms
3ms
Starlark (Interpreter)
gpython
11,324ms
4ms
Python (Interpreter)
Yaegi
11,715ms
10ms
Yaegi (Interpreter)
otto
48,539ms
6ms
JavaScript (Interpreter)
Anko
52,821ms
6ms
Anko (Interpreter)
-
-
-
-
Go
47ms
2ms
Go (Native)
Lua
756ms
2ms
Lua (Native)
Python
1,907ms
14ms
Python2 (Native)
* fib(35):
Fibonacci(35)
* fibt(35):
tail-call version of Fibonacci(35)
* Go does not read the source code from file, while all other cases do
* See here for commands/codes used
go get github.com/d5/tengo/v2
A simple Go example code that compiles/runs Tengo script code with some input/output values:
…
Or, if you need to evaluate a simple expression, you can use Eval function instead:
res, err := tengo.Eval(ctx,
`input ? "success" : "fail"`,
map[string]interface{}{"input": 1})
if err != nil {
panic(err)
}
fmt.Println(res) // "success"
times.in_location Runtime Error in Some Computer
json.Number can't pass in vm
[Question] What is the recommended pattern for injecting Go variables to override in-script defaults?
Example to make function call and retrieve result.
A case where closure doesn't have access to imported modules
Import path for v3
Tengo with LLM
[question] How can I register native type into script?