Go中调用JS代码(otto)的实现示例

 更新时间:2024年10月21日 10:03:19   作者:丶atty  
Otto是一个用Go语言实现的JavaScript解释器,可用于执行和操作JavaScript代码,适合在Go项目中执行简单的JS脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

otto是一个Go语言实现的JavaScript 解释器,它的项目地址为:https://github.com/robertkrimen/otto

Otto实现了 ECMAScript 5.1 的大部分功能。你可以使用 Otto 来执行 JavaScript 代码,甚至可以定义和调用函数,操作对象等。但请注意,Otto 目前只支持 ECMAScript 5.1,不支持 ECMAScript 6 或更高版本的功能。

假如我现在有一个encrypt.js的文件,里面的内容为:

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encodeInp(input) {
    var output = "";
    var chr1, chr2, chr3 = "";
    var enc1, enc2, enc3, enc4 = "";
    var i = 0;
    do {
        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);
        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;
        if (isNaN(chr2)) {
            enc3 = enc4 = 64
        } else if (isNaN(chr3)) {
            enc4 = 64
        }
        output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
        chr1 = chr2 = chr3 = "";
        enc1 = enc2 = enc3 = enc4 = ""
    } while (i < input.length);
    return output
}

这个文件里有一个函数是用来加密的(其实就是一个base64),然后当我们写爬虫或者其他的东西时我们需要将这段代码运行一遍,并获取其返回的值。

那么我们在Go中就可以这样写:

package main

import (
	"fmt"
	"github.com/robertkrimen/otto"
	"io/ioutil"
)

func main() {
	filePath := "你的JS文件的路径"
	//先读入文件内容
	bytes, err := ioutil.ReadFile(filePath)
	if err != nil {
		panic(err)
	}

	vm := otto.New()
	
	_, err = vm.Run(string(bytes))
	if err!=nil {
		panic(err)
	}
	
	data := "你需要传给JS函数的参数"
	//encodeInp是JS函数的函数名
	value, err := vm.Call("encodeInp", nil, data) 
	if err != nil {
		panic(err)
	}
	fmt.Println(value.String())
}

然后假如你以后会经常性的使用这段代码的话,你也可以给它进行一个小封装。

func JsParser(filePath string, functionName string, args... interface{}) (result string) {
	//读入文件
	bytes, err := ioutil.ReadFile(filePath)
	if err!=nil {
		panic(err)
	}

	vm := otto.New()
	_, err = vm.Run(string(bytes))
	if err!=nil {
		panic(err)
	}
	value, err := vm.Call(functionName, nil, args...)
	if err != nil {
		panic(err)
	}

	return value.String()
}

其实otto还有很多有趣的功能,大家可以去otto的github项目里去看。

到此这篇关于Go中调用JS代码(otto)的实现示例的文章就介绍到这了,更多相关Go调用JS代码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • golang常用库之配置文件解析库-viper使用详解

    golang常用库之配置文件解析库-viper使用详解

    viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cobra 开发者,这篇文章主要介绍了golang常用库之配置文件解析库-viper使用详解,需要的朋友可以参考下
    2020-10-10
  • 从零封装Gin框架及项目初始化教程

    从零封装Gin框架及项目初始化教程

    这篇文章主要为大家介绍了从零封装Gin框架及项目的初始化教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • GoLang实现Viper库的封装流程详解

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

    Viper是一个用于Go语言应用程序的配置管理库,它提供了一种简单而灵活的方式来处理应用程序的配置,支持多种格式的配置文件,这篇文章主要介绍了GoLang封装Viper库的流程,感兴趣的同学可以参考下文
    2023-05-05
  • Go中的动态速率限制有效控制流量

    Go中的动态速率限制有效控制流量

    这篇文章主要为大家介绍了Go中的动态速率限制有效控制流量,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • golang中package is not in GOROOT报错的真正解决办法

    golang中package is not in GOROOT报错的真正解决办法

    这篇文章主要给大家介绍了关于golang中package is not in GOROOT报错的真正解决办法,文中通过图文介绍的非常详细,对同样遇到这个问题的朋友具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • Go pprof内存指标含义备忘录及案例分析

    Go pprof内存指标含义备忘录及案例分析

    这篇文章主要介绍了Go pprof内存指标含义备忘录问题,小编特此把问题及案例分享到脚本之家平台供大家学习,需要的朋友可以参考下
    2020-03-03
  • Golang实现http server提供压缩文件下载功能

    Golang实现http server提供压缩文件下载功能

    这篇文章主要介绍了Golang实现http server提供压缩文件下载功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Go语言包管理工具dep的安装与使用

    Go语言包管理工具dep的安装与使用

    godep是解决包依赖的管理工具,下面这篇文章主要给大家介绍了关于Go语言包管理工具dep的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • golang微服务框架kratos实现Socket.IO服务的方法

    golang微服务框架kratos实现Socket.IO服务的方法

    本文主要介绍了golang微服务框架kratos实现Socket.IO服务的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Go语言CSP并发模型goroutine及channel底层实现原理

    Go语言CSP并发模型goroutine及channel底层实现原理

    这篇文章主要为大家介绍了Go语言CSP并发模型goroutine channel底层实现原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论