go otto js插件化

2023-11-21 20:20
文章标签 go js 插件 otto

本文主要是介绍go otto js插件化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  这几天发现了一个特别有趣的东西,只要照着规定好的插件模板写,不懂go语法的人也可以交互go代码,大大提高了go代码的可扩展性,易用性。

  1. 范例代码
    main.go
package mainimport ("fmt""github.com/gin-gonic/gin""log"
)func main(){//加载文件夹下所有插件plugins:=loadPlugins("./jsfilters")r:=gin.New()r.Use(func(context *gin.Context) {exchange:=NewExchange(context.Request)//遍历调用所有插件主函数for _,p:=range plugins{p.Filter(exchange)}context.Next()})r.Handle("GET","/", func(context *gin.Context) {//打印header头fmt.Println(context.Request.Header.Get("Name"))fmt.Println(context.Request.Header.Get("Age"))context.JSON(200,gin.H{"result":"ok"})})err := r.Run(":8080")if err!=nil{log.Panic(err)}}

helper.go(交互逻辑代码)

package mainimport ("github.com/robertkrimen/otto""io/ioutil""log""net/http""path"
)
func readFile(file string) string {b,err:=ioutil.ReadFile(file)if err!=nil{return ""}return string(b)
}
type This struct {}
type Exchange struct {Request *http.Request
}
func NewExchange(request *http.Request) *Exchange {return &Exchange{Request:request}
}type FilterPlugin struct {Name stringMain otto.Value
}
//调用插件对象里的mian方法
func(self *FilterPlugin) Filter(exchange *Exchange){this,_:=otto.ToValue(nil)_,err:=self.Main.Call(this,exchange)  //调用 闭包 ,传递上下文参数if err!=nil{log.Println(err)}
}func loadPlugin(js *otto.Otto) *FilterPlugin  {//获取插件名称filter_name,err:=js.Call("name",nil)if err!=nil{log.Println(err)return nil}//获取插件主函数filter_main,err:=js.Call("main",nil)if err!=nil || !filter_main.IsFunction(){log.Println(err)return nil}//返回插件对象return &FilterPlugin{Name:filter_name.String(),Main:filter_main}
}//加载文件夹下所有插件
func loadPlugins(dirname string) []*FilterPlugin  {//插件对象切片ret:=make([]*FilterPlugin,0)//读取文件夹fileInfos, _ := ioutil.ReadDir(dirname)//遍历文件for _, file := range  fileInfos {if !file.IsDir() && path.Ext(file.Name())==".js"{//如果是JS文件js:=otto.New()//运行_,err:=js.Run(readFile(dirname+"/"+file.Name()))if err!=nil{log.Println(err)continue}if p:=loadPlugin(js);p!=nil{//获取到插件对象,则追加到数组ret=append(ret,p)}}}return ret
}

JS模板1

function main() {return function (exchange) {//设置header头exchange.Request.Header.Set("Name","shenyi")}
}
//插件名
function name() {return 'Test'
}

JS模板2

function main() {return function (exchange) {//设置header头exchange.Request.Header.Set("Age",19)}
}
//插件名
function name() {return 'Abc'
}
  1. 测试,运行main.go,访问http://localhost:8080

在这里插入图片描述

这篇关于go otto js插件化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404848

相关文章

maven中的maven-antrun-plugin插件示例详解

《maven中的maven-antrun-plugin插件示例详解》maven-antrun-plugin是Maven生态中一个强大的工具,尤其适合需要复用Ant脚本或实现复杂构建逻辑的场景... 目录1. 核心功能2. 典型使用场景3. 配置示例4. 关键配置项5. 优缺点分析6. 最佳实践7. 常见问题

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

go rate 原生标准限速库的使用

《gorate原生标准限速库的使用》本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定... 目录介绍安装API介绍rate.NewLimiter:创建限流器limiter.Allow():请求是否

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑