go执行静态二进制文件和执行动态库文件

目的和需求:部分go的核心文件不开源,例如验证,主程序核心逻辑等等

第一个想法,把子程序代码打包成静态文件,然后主程序执行

子程序

package mainimport ("fmt""github.com/gogf/gf/v2/os/gfile"
)func Valid() {contents := gfile.GetContents("cert.key")if contents != "123456" {fmt.Println("不通过")//主程序执行静态编译的文件,停止不到主程序//panic("not pass")}}func main() {Valid()}

执行打包命令:gf build -o valid
valid文件拷贝到主程序根目录

主程序

package hello
import ("context""fmt""gfdemo/api/hello/v1""gfdemo/internal/model""gfdemo/internal/service""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/util/gconv""os""os/exec"
)
func init() {//方法一:直接执行二进制静态文件cmd := exec.Command("./valid")// 将标准输出连接到当前程序的标准输出cmd.Stdout = os.Stdout// 运行命令err := cmd.Run()if err != nil {fmt.Println("Error:", err.Error())}
}	

结论:这个方案,达不到预期,因为子程序验证不通过,没办法停止主程序

第二个想法,把子程序打包成动态库,主程序调用

子程序

package mainfunc Valid(name string) string {if name != "123456" {panic("不通过")}return "Hello world"
}

执行打包命令:go build -buildmode=plugin -o core.so main.go
core.so文件拷贝到主程序路径 :core/core.so

主程序

package hello
import ("context""fmt""gfdemo/api/hello/v1""gfdemo/internal/model""gfdemo/internal/service""github.com/gogf/gf/v2/frame/g""github.com/gogf/gf/v2/util/gconv""os""os/exec"
)
func init() {contents := gfile.GetContents("cert.key")plug, err := plugin.Open("core/core.so")if err != nil {fmt.Println("Error loading plugin:", err)return}validSymbol, err := plug.Lookup("Valid")if err != nil {fmt.Println("Error Lookup plugin:", err)return}validFunc, ok := validSymbol.(func(string) string)if !ok {fmt.Println("Error asserting function type")return}result := validFunc(contents)fmt.Println(result)
}	

在这里插入图片描述

结论:满足需求,子程序可以停止主程序
这里只是简单演示,如果要真正在项目上面实现这个需求,肯定不能单纯靠验证根目录文件限制,我觉得可以把一些核心逻辑代码放到子程序,主程序再调用执行,同时子程序也要验证根目录证书,这样主程序必定要用到子程序的逻辑才能完整运行,达到预期目的

Plugin文档:https://pkg.go.dev/plugin
demo代码上传在 github:https://github.com/gzdzh/gfdemo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReCAPTCHA 解决方案的自动识别和解决方法

ReCAPTCHA,作为广泛使用的安全措施,旨在区分人类和自动化机器人。然而,技术的进步导致了自动识别和解决 ReCAPTCHA 挑战的方法的发展。在本文中,我们将探讨自动 ReCAPTCHA 识别和解决技术的概念,以及创新解决方案 Caps…

Yapi部署指南:在 Linux 上 Yapi 教程

YApi YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单…

题目:最大数组和(蓝桥OJ 3260)

问题描述: 解题思路: 官方: 总结:使用模拟。排序数组,枚举删除最大个数并推出其删除最小个数 ,即可枚举出每一种可能的区间和,依次比较找最大区间和(使用前缀和求区间和O(1)…

MySQL数据管理(一)

一、列类型 列类型指规定数据库中该列存放的数据类型 列类型分类 数值类型字符串类型日期和时间型数值类型 数值类型 字符串类型 日期和时间类型 MySQL允许“不严格”语法,任何标点符号都可以作为日期部分之间的间隔符,如“24-01-03”、“24.01.03”…

SSM建材商城网站----计算机毕业设计

项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 管理员角色包含以下功能: 管理员登录,管理员管理,注册用户管理,新闻公告管理,建材类型管理,配货点管理,建材商品管理,建材订单管理,建材评价管理等功能。 用…

VCoder:大语言模型的眼睛

简介 VCoder的一个视觉编码器,能够帮助MLLM更好地理解和分析图像内容。提高模型在识别图像中的对象、理解图像场景方面的能力。它可以帮助模型显示图片中不同物体的轮廓或深度图(显示物体距离相机的远近)。还能更准确的理解图片中的物体是什…

C#如何将本地文件上传至阿里云OSS中

要想将文件上传至OSS,那么阿里云的AccessKeyId和AccessKeySecret必不可少 一.去哪找AccessKeyId和AccessKeySecret 进入阿里云工作台,点击右上角头像,选择AccessKey管理,就能看到ID了 但是Secret目前阿里云不支持查看了&#xf…

labelme读取文件顺序

labelme版本4.5.10 labelme的目录结构 labelme通过在__main__.py中调用app.py,启动程序读取文件列表的部分在app.py的imageList函数中 def imageList(self):lst []for i in range(self.fileListWidget.count()):item self.fileListWidget.item(i)lst.append(ite…

应用系统如何集成和扩展开源工作流引擎

目前主流的开源流程引擎有activiti、flowable、camunda等,这几个开源流程引擎的版本很多,哪个开源流程引擎哪个版本的功能更多、性能更好,该如何选择请参考:https://lowcode.blog.csdn.net/article/details/116405594 无论您选择…

AR技术改变汽车行业,AR看车、AR车书、AR售后维修震撼登场!

引言: 随着中国汽车市场步入存量发展阶段,车企正迎来新的机遇和挑战。这一发展意味着庞大的汽车后市场需求,同时也要求企业和经销商能够快速响应市场需求,提供高质量的服务。而培养具备全面技能的成熟售后服务人员需要企业投入大…

HubSpot电子邮件:数字化时代的营销利器

在当今数字化时代,电子邮件仍然是企业与客户之间沟通的重要手段之一。而HubSpot电子邮件作为HubSpot全方位解决方案的一部分,不仅简化了营销流程,更为企业提供了强大的工具,助力建立更紧密的客户关系。本文将深入探讨HubSpot电子邮…

深度学习在工地安全帽识别技术的应用与展望

当我们谈论“工地安全帽识别”时,实际上我们在探讨的是如何利用深度学习图像识别技术来提高建筑工地的安全性。这一技术的应用可以显著提高工地安全管理的效率和有效性,是现代建筑工程管理中不可或缺的一部分。以测评的北京富维图像的工地安全帽识别为例…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位(SKU)​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位(SKU)​ SKU 概念 存货单位(Stock Keeping Unit&a…

BUUCTF--gyctf_2020_borrowstack1

这是一题栈迁移的题目,先看看保护: 黑盒测试: 用户可输入两次内容,接着看看IDA中具体程序流程: 我们看到溢出内容只有0x10的空间给我们布局,这显然是不足以我们布置rop的。因此肯定就是栈迁移了。迁到什么地…

Vue3地图选点组件

Vue3地图选点组件 <template><div style"width: 100%; height: 500px"><div class"search-container"><el-autocompletev-model"suggestionKeyWord"class"search-container__input"clearable:fetch-suggestion…

error:0308010C:digital envelope routines::unsupported 前端项目错误

直接启动命令中增加&#xff1a; SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve

猫咪主食冻干K9、希喂、SC生骨肉冻干哪款好?详细对比测评这三款产品

随着科学养猫的观念深入人心&#xff0c;越来越多的铲屎官开始关注猫咪主食的营养与健康。主食冻干&#xff0c;作为一种模拟猫咪原始猎食的食品&#xff0c;因其高营养保留而受到广大猫奴的喜爱。相比传统的膨化猫粮&#xff0c;主食冻干更符合猫咪的饮食天性&#xff0c;提供…

计算机Java项目|基于SSM实现的在线考试系统

项目编号&#xff1a;L-BS-ZXBS-04 一&#xff0c;环境介绍 语言环境&#xff1a;Java: jdk1.8 数据库&#xff1a;Mysql: mysql5.7 应用服务器&#xff1a;Tomcat: tomcat8.5.31 开发工具&#xff1a;IDEA或eclipse 后台框架&#xff1a;Spring、SpringMVC、MyBatis …

C语言编译器(C语言编程软件)完全攻略(第五部分:VS2015使用教程(使用VS2015编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 五、VS2015使用教程&#xff08;使用VS2015编写C语言程序&#xff09; 前面我们给出了一段完整的C语言代码&#xff0c;就是在显示器上输出“C语言中文网”&#xff0c;如下所示&#xff1a; #include <stdio.h> int main() {…

Leetcode_day01_88合并两个有序数组

Leetcode_day01_88合并两个有序数组 题目描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺…