如何在Golang中运行JavaScript

 更新时间:2022年01月26日 10:46:27   作者:kingname  
最近写一个程序,接口返回的数据是js格式的,需要通过golang来解析js,所以下面这篇文章主要给大家介绍了关于如何在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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Kubernetes上使用Jaeger分布式追踪基础设施详解

    Kubernetes上使用Jaeger分布式追踪基础设施详解

    这篇文章主要为大家介绍了Kubernetes上使用Jaeger分布式追踪基础设施详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Golang使用crypto/ed25519实现数字签名和验证

    Golang使用crypto/ed25519实现数字签名和验证

    本文将深入探讨如何在 Golang 中使用 crypto/ed25519 进行数字签名和验证,我们将从基本原理开始,逐步引导读者了解生成密钥对、进行数字签名,以及验证签名的具体过程,希望对大家有所帮助
    2024-02-02
  • go语言中的log 包示例详解

    go语言中的log 包示例详解

    Go语言的log包提供了用于记录日志的基本功能,相比fmt包,增加了时间戳、日志级别等日志管理功能,非常适合用于调试和记录运行信息,本文呢介绍go语言中的log 包,感兴趣的朋友一起看看吧
    2024-11-11
  • GoLang实现Viper库的封装流程详解

    GoLang实现Viper库的封装流程详解

    Viper是一个用于Go语言应用程序的配置管理库,它提供了一种简单而灵活的方式来处理应用程序的配置,支持多种格式的配置文件,这篇文章主要介绍了GoLang封装Viper库的流程,感兴趣的同学可以参考下文
    2023-05-05
  • 详解go-zero如何实现令牌桶限流

    详解go-zero如何实现令牌桶限流

    令牌桶算法既能够将所有的请求平均分布到时间区间内,又能接受服务器能够承受范围内的突发请求,因此是目前使用较为广泛的一种限流算法,本文就来看看go-zero如何实现令牌桶限流的吧
    2023-08-08
  • 如何使用go实现创建WebSocket服务器

    如何使用go实现创建WebSocket服务器

    文章介绍了如何使用Go语言和gorilla/websocket库创建一个简单的WebSocket服务器,并实现商品信息的实时广播,感兴趣的朋友一起看看吧
    2024-11-11
  • Golang实现Redis事务深入探究

    Golang实现Redis事务深入探究

    这篇文章主要介绍了Golang实现Redis事务深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言中排序的3种实现方法

    Go语言中排序的3种实现方法

    在写代码过程中,排序是经常会遇到的需求,这篇文章主要为大家介绍三种常用的方法,文中的示例代码简洁易懂,需要的小伙伴可以参考下
    2023-08-08
  • go语言中的template使用示例详解

    go语言中的template使用示例详解

    在Go语言中,可以通过text/template和html/template包来处理模板,本文提供了一个使用Go模板的基本示例,包括导入包、创建数据结构、定义模板、执行模板及运行程序,通过这些步骤,可以输出一个格式化的YAML配置
    2024-10-10
  • Go语言题解LeetCode561数组拆分

    Go语言题解LeetCode561数组拆分

    这篇文章主要为大家介绍了Go语言题解LeetCode561数组拆分示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论