如何在Golang中运行JavaScript

我们知道,在 Python 里面,如果你要运行一段 JavaScript,你可以使用execJS这种第三方库。那么在 Golang 里面,你想运行 JavaScript 的时候又应该怎么办呢?

最近我发现一个使用 Golang 开发的 JavaScript 引擎:Goja[1]。它实现了ES 5.1的所有语法和大部分的ES 6语法,比 Python 的execJS要厉害得多。在一定程度上和特定场景下,它可以完全替代Chrome 的 V8引擎。

我们来看看如使用它运行一段 JavaScript 代码。首先,我来写一段递归版的 JavaScript 代码计算斐波那契数列:

function fib(n) {
    if (n === 1 || n === 2) {
        return 1 
    }
    return fib(n - 1) + fib(n - 2)
}

直接在浏览器上面运行的效果如下:

现在,我们来安装这个Goja:

go get github.com/dop251/goja

接下来我们在 Go 中运行 js 代码:

package main

import (
    "fmt"

    "github.com/dop251/goja"
)

func main() {

    const script = `
    function fib(n) {
        if (n === 1 || n === 2) {
            return 1 
        }
        return fib(n - 1) + fib(n - 2)
    }
    `
    vm := goja.New()
    _, err := vm.RunString(script)
    if err != nil {
        fmt.Println("JS代码有问题!")
        return
    }
    var fn func(int32) int32
    err = vm.ExportTo(vm.Get("fib"), &fn)
    if err != nil {
        fmt.Println("Js函数映射到 Go 函数失败!")
        return
    }
    fmt.Println("斐波那契数列第30项的值为:", fn(30))
}

运行效果如下图所示:

我们来解释一下上面代码的意思。请大家关注截图中的代码行号。第19行,我们创建了一个 JavaScript 的虚拟机。然后在第20行,把这个函数加载到了虚拟机当中。

第25行,我们创建了一个变量,这个变量是函数类型,这个函数接收一个 int32作为参数,并返回另一个int32类型的数据。

第26行,我们把 Golang 里面的这个函数变量与 JavaScript 里面的函数fib关联起来,这样我们就能直接写 Go 代码来调用 JavaScript 代码了。

第31行,我们像调用普通的 Go 函数一样传入参数,然后获得结果。

有一些同学在做爬虫的时候,需要运行一段 JavaScript 代码来生成一段 token,那你不妨试一试Goja,它的速度肯定要比你用Python 版本的快很多。

参考文献

[1] Goja: https://github.com/dop251/goja

总结

到此这篇关于如何在Golang中运行JavaScript的文章就介绍到这了,更多相关Golang中运行JavaScript内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用Golang运行JavaScript的实现示例

    C++太麻烦(难)了,想要盘弄一下V8实在是有些费劲,但是Golang社区出了几个Javascript引擎,要尝试在别的语言中如何集成Javascript,是个不错的选择.以下选了github.com/dop251/goja 来做例子. Hello world 照着仓库的Readme,来一个: package main import ( "fmt" js "github.com/dop251/goja" ) func main() { vm := js.New()

  • 如何在Golang中运行JavaScript

    我们知道,在 Python 里面,如果你要运行一段 JavaScript,你可以使用execJS这种第三方库.那么在 Golang 里面,你想运行 JavaScript 的时候又应该怎么办呢? 最近我发现一个使用 Golang 开发的 JavaScript 引擎:Goja[1].它实现了ES 5.1的所有语法和大部分的ES 6语法,比 Python 的execJS要厉害得多.在一定程度上和特定场景下,它可以完全替代Chrome 的 V8引擎. 我们来看看如使用它运行一段 JavaScript 代

  • 如何在WebForm中使用javascript防止连打(双击)

    http://www.cnblogs.com/dahuzizyd/archive/2007/01/04/javascript_Double_click.html在WebForm上,有的处理需要比较长的时间,为了防止重复提交,就要使用防连击 javaScript代码: function doubleCheck(){     if (window.document.readyState != null &&             window.document.readyState != '

  • 如何在Windows中运行多个MySQL实例详解

    前言 在Windows中可以从命令行为每个实例使用合适的操作参数来手动启动多个MySQL实例或者通过以Windows服务方式来安装多个服务器来运行. 1.在windows中MySQL的base目录中创建两个新实例的数据目录data3307,data3308 2.为每个新实例设置配置文件来指定相关选项 my3307.cnf文件内容如下: [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8mb4 [mysqld] # 设置3307端口 port

  • 详解如何在Apache中运行Python WSGI应用

    在生产环境上,一般会使用比较健壮的Web服务器,如Apache来运行我们的应用.如果我们的Web应用是采用Python开发,而且符合WSGI规范,比如基于Django,Flask等框架,那如何将其部署在Apache中呢?本文中,我们就会介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用. 安装mod_wsgi 我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装.在Ubuntu或Debian环境中,你可以使用apt-get命令来

  • 如何在django中运行scrapy框架

    1.新建一个django项目, 2.前端展示一个按钮 <form action="/start/" method="POST"> {% csrf_token %} <input type="submit" value="启动爬虫"> </form> 3.在django项目的根目录创建scrapy项目 4.cmd命令行运行:scrapyd 启动服务 5.将scrapy项目部署到当前工程:scr

  • 如何在docker中运行springboot项目过程图解

    一.IDEA中点击下方的Terminal 输入mvn clean install 出现如下图时表示成功(前提是本地必须安装了maven且配置了maven的环境变量) 打好的jar包在target目录下 二.然后新建个Dockerfile文件,内容如下 三.构建镜像:将Dockerfile和项目jar包放在服务器同一目录下,然后进入该目录 输入:docker build -t app . (注意后面有个点,app为自定义镜像名)构建镜像 查看镜像是否存在: docker images 四.运行刚才

  • 如何在JavaScript中运行.NET Core代码详情

    目录 一.前言 二.DotNetJS 三.Demo 1. 创建项目 2. 实现C#代码 3. 实现JS代码 4. 运行效果 四.结论 一.前言 在.NET Core中运行JavaScript代码,目前已经有很多实现方案. 但是,如果你希望在纯JavaScript环境中运行.NET Core代码呢? 那么,DotNetJS可能对你有所帮助. 二.DotNetJS DotNetJS可以将C#项目编译为与任何环境兼容的单文件JavaScript库,无论是Web浏览器,Node.js还是自定义限制空间,

  • Golang迭代如何在Go中循环数据结构使用详解

    目录 引言 如何在Go中循环字符串 如何在Go中循环map结构 如何在Go中循环Struct 结论 引言 数组是存储类似类型数据的强大数据结构.您可以通过索引识别和访问其中的元素. 在Golang中,您可以通过在0初始化变量i并增加变量直到它达到数组的长度,使用for循环循环数组. 它们的语法如下所示: for i := 0; i < len(arr); i++ { // perform an operation } 例如,让我们循环一个整数数组: package main import ( &qu

  • 在 Golang 中使用 Cobra 创建 CLI 应用

    虽然现在我们使用的大多数软件都是可视化的,很容易上手,但是这并不代表 CLI(命令行)应用就没有用武之地了,特别是对于开发人员来说,还是会经常和 CLI 应用打交道.而 Golang 就非常适合用来构建 CLI 应用,下面我们就将来介绍如何在 Golang 中构建一个 CLI 应用. 对于开发人员来说平时可能就需要使用到很多 CLI 工具,比如 npm.node.go.python.docker.kubectl 等等,因为这些工具非常小巧.没有依赖性.非常适合系统管理或者一些自动化任务等等. 我

  • golang中实现graphql请求的方法

    目录 前言 安装gqlgen 初始化项目 编写schema 生成代码 编写resolver 运行GraphQL服务 安装Apollo客户端 创建Apollo客户端 执行GraphQL请求 结论 前言 GraphQL是一种新的API设计语言,它提供了更加灵活.高效的API查询方式.与RESTful API相比,GraphQL可以更好地满足前端工程师的需求,使得API的开发更加便捷.gqlgen是一款用于Golang语言开发的GraphQL库,它可以帮助您更快地构建高质量的GraphQL服务.在本文

随机推荐