Skip to content
Yaegi is Another Elegant Go Interpreter
Go Other
  1. Go 99.6%
  2. Other 0.4%
Branch: master
Clone or download
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/ISSUE_TEMPLATE doc: fix spelling Oct 30, 2019
_test fix: continue statement was not applied correctly Jan 10, 2020
cmd Case sensitivity fix Jan 15, 2020
doc/images doc: remove todo. (#248) Jul 21, 2019
example chore: update linter to support go1.13 Oct 9, 2019
internal/genop fix: add support for ^ and + as unary operators Jan 7, 2020
interp fix: continue statement was not applied correctly Jan 10, 2020
stdlib doc: document import of source and binary packages (#477) Jan 8, 2020
.golangci.toml chore: update linter to support go1.13 Oct 9, 2019
.goreleaser.yml chore: add goexports to the archive. Aug 1, 2019
.travis.yml interp: fix map range handling Oct 1, 2019 doc: add explanation about CLA in (#483) Jan 7, 2020
Makefile Add an example of yaegi in a shebang line Jan 15, 2020
generate.go chore: Move commands (#235) Jul 3, 2019
go.mod Drop go1.11 Oct 1, 2019


release Build Status GoDoc Discourse status

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 and syscall packages neither used nor exported by default
  • Support Go 1.12 and Go 1.13 (the latest 2 major releases)


Go package

import ""

Command-line executable

go get -u

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.


As an embedded interpreter

Create an interpreter with New(), run Go code with Eval():

package main

import (

func main() {
	i := interp.New(interp.Options{})


	_, err := i.Eval(`import "fmt"`)
	if err != nil {

	_, err = i.Eval(`fmt.Println("Hello Yaegi")`)
	if err != nil {

Go Playground

As a dynamic extension framework

The following program is compiled ahead of time, except bar() which is interpreted, with the following steps:

  1. use of i.Eval(src) to evaluate the script in the context of interpreter
  2. use of v, err := i.Eval("foo.Bar") to get the symbol from the interpreter context, as a reflect.Value
  3. application of Interface() method and type assertion to convert v into bar, as if it was compiled
package main

import ""

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 != nil {

	v, err := i.Eval("foo.Bar")
	if err != nil {

	bar := v.Interface().(func(string) string)

	r := bar("Kung")

Go Playground

As a command-line interpreter

The Yaegi command can run an interactive Read-Eval-Print-Loop:

$ yaegi
> 1 + 2
> import "fmt"
> fmt.Println("Hello World")
Hello World

Or interpret Go files:

$ yaegi cmd/yaegi/yaegi.go

Or for Go scripting in the shebang line:

$ cat /tmp/test
#!/usr/bin/env yaegi
package main

import "fmt"

func main() {
$ ls -la /tmp/test
-rwxr-xr-x 1 dow184 dow184 93 Jan  6 13:38 /tmp/test
$ /tmp/test


Documentation about Yaegi commands and libraries can be found at usual


Beside the known bugs which are supposed to be fixed in the short term, there are some limitations not planned to be addressed soon:

  • assembly files (.s) are not supported
  • calling C code is not supported (no virtual "C" package)
  • interfaces to be used from the pre-compiled code can not be added dynamically, as it is required to pre-compile interface wrappers
  • representation of types by reflect and printing values using %T may give different results between compiled mode and interpreted mode
  • interpreting computation intensive code is likely to remain significantly slower than in compiled mode


Contributing guide.


Apache 2.0.

You can’t perform that action at this time.