Skip to content
Execute JavaScript from Go
Go Python C++ C
Branch: master
Clone or download
github-actions and rogchap V8 static library for darwin and linux (#19)
* Update V8 static library for macos-latest

* Update V8 static library for ubuntu-latest (#20)
Latest commit fb5bf53 Sep 22, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
deps V8 static library for darwin and linux (#19) Sep 22, 2019
.travis.yml setup of context and run script apis Aug 30, 2019 Create Sep 4, 2019
LICENSE Upgrade V8 to (#18) Sep 22, 2019
cgo.go move test to the correct files Sep 1, 2019
context.go Add missing delete to free up memory (#9) Sep 17, 2019
errors_test.go better error handling and error formatting Sep 2, 2019
isolate.go Isolate terminate execution (#5) Sep 7, 2019
isolate_test.go Isolate terminate execution (#5) Sep 7, 2019
value.go Add missing delete to free up memory (#9) Sep 17, 2019
value_test.go add linux binaryand change import to include Sep 3, 2019

Execute JavaScript from Go

Go Report Card GoDoc Build Status

V8 Gopher based on original artwork from the amazing Renee French


import ""

Running a script

ctx, _ := v8go.NewContext(nil) // creates a new V8 context with a new Isolate aka VM
ctx.RunScript("const add = (a, b) => a + b", "math.js") // executes a script on the global context
ctx.RunScript("const result = add(3, 4)", "main.js") // any functions previously added to the context can be called
val, _ := ctx.RunScript("result", "value.js") // return a value in JavaScript back to Go
fmt.Printf("addition result: %s", val)

One VM, many contexts

vm, _ := v8go.NewIsolate() // creates a new JavaScript VM
ctx1, _ := v8go.NewContext(vm) // new context within the VM
ctx1.RunScript("const multiply = (a, b) => a * b", "math.js")

ctx2, _ := v8go.NewContext(vm) // another context on the same VM
if _, err := ctx2.RunScript("multiply(3, 4)", "main.js"); err != nil {
  // this will error as multiply is not defined in this context

Javascript errors

val, err := ctx.RunScript(src, filename)
if err != nil {
  err = err.(v8go.JSError) // JavaScript errors will be returned as the JSError struct
  fmt.Println(err.Message) // the message of the exception thrown
  fmt.Println(err.Location) // the filename, line number and the column where the error occured
  fmt.Println(err.StackTrace) // the full stack trace of the error, if available

  fmt.Printf("javascript error: %v", err) // will format the standard error message
  fmt.Printf("javascript stack trace: %+v", err) // will format the full error stack trace

Terminate long running scripts

vals := make(chan *v8go.Value, 1)
errs := make(chan error, 1)

go func() {
    val, err := ctx.RunScript(script, "forever.js") // exec a long running script
    if err != nil {
        errs <- err
    vals <- val

select {
case val := <- vals:
    // sucess
case err := <- errs:
    // javascript error
case <- time.After(200 * time.Milliseconds):
    vm, _ := ctx.Isolate() // get the Isolate from the context
    vm.TerminateExecution() // terminate the execution 
    err := <- errs // will get a termination error back from the running script



V8 dependency

V8 version:

In order to make v8go usable as a standard Go package, prebuilt static libraries of V8 are included for Linux and OSX ie. you should not require to build V8 yourself.

V8 requires 64-bit, therefore will not work on 32-bit systems.

V8 Gopher image based on original artwork from the amazing Renee French.

You can’t perform that action at this time.