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

相关文章

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Go Gorm 示例详解

《GoGorm示例详解》Gorm是一款高性能的GolangORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本... 目录1. 概念2. 数据库连接2.1 安装依赖2.2 连接数据库3. 数据库基本操作3.1 创建表(表关

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件