Yaegi is Another Elegant Go Interpreter. It powers executable Go scripts and plugins, in embedded interpreters or interactive shells, on top of the Go runtime.
- Complete support of Go specification
- Written in pure Go, using only the standard library
- Simple interpreter API:
New()
,Eval()
,Use()
- Works everywhere Go works
- All Go & runtime resources accessible from script (with control)
- Security:
unsafe
andsyscall
packages neither used nor exported by default - Support the latest 2 major releases of Go (Go 1.21 and Go 1.22)
import "github.com/traefik/yaegi/interp"
go install github.com/traefik/yaegi/cmd/yaegi@latest
Note that you can use rlwrap (install with your favorite package manager),
and alias the yaegi
command in alias yaegi='rlwrap yaegi'
in your ~/.bashrc
, to have history and command line edition.
curl -sfL https://raw.githubusercontent.com/traefik/yaegi/master/install.sh | bash -s -- -b $GOPATH/bin v0.9.0
Create an interpreter with New()
, run Go code with Eval()
:
package main
import (
"github.com/traefik/yaegi/interp"
"github.com/traefik/yaegi/stdlib"
)
func main() {
i := interp.New(interp.Options{})
i.Use(stdlib.Symbols)
_, err := i.Eval(`import "fmt"`)
if err != nil {
panic(err)
}
_, err = i.Eval(`fmt.Println("Hello Yaegi")`)
if err != nil {
panic(err)
}
}
The following program is compiled ahead of time, except bar()
which is interpreted, with the following steps:
- use of
i.Eval(src)
to evaluate the script in the context of interpreter - use of
v, err := i.Eval("foo.Bar")
to get the symbol from the interpreter context, as areflect.Value
- application of
Interface()
method and type assertion to convertv
intobar
, as if it was compiled
package main
import "github.com/traefik/yaegi/interp"
const src = `package foo
func Bar(s string) string { return s + "-Foo" }`
func main() {
i := interp.New(interp.Options{})
_, err := i.Eval(src)
if err !=