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

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

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

子程序

package main

import (
	"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 main

func 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云服务器评估迁移时间与测试传输速度

迁移周期主要分为迁移前、迁移过程中、迁移后三部分。迁移周期时长与待迁移服务器的数量和实际数据量成正比,建议您根据实际迁移测试演练进行评估。本文主要介绍迁移过程中这一阶段所需时间的评估方式和传输速度的测试方法。 背景信息 在SMC迁移过程中&#xff0c…

UV打印机磁栅尺的安装

UV打印机磁栅尺的安装方法有以下几个注意事项: 1. 安装基面的选择:磁栅尺需要粘合在平滑的基面上,基面要足够平整且干净,不能有杂质或油污。 2. 粘合剂的选用:磁栅尺的粘合剂需要选用合适的胶水,最好是专门…

maven:在maven中使用tomcat7插件

1、在pom.xml中添加tomcat7插件 <build><!-- Embedded Apache Tomcat required for testing war --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</ver…

【JavaFX】JavaFX11开发踩坑记录

文章目录 技术栈踩坑记录 技术栈 JavaFX 11MavenJDK 11 踩坑记录 这些坑对于初学者很容易踩&#xff0c;JavaFX经常会报错空指针异常遇到其中一个问题可能就会消耗好几天的时间。 JavaFX 采用的是MVC架构设计&#xff0c;页面设计使用 fxml文件&#xff1b;业务逻辑采用Con…

前端框架的异步组件(Async Components)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

pytorch集智-1安装与简单使用

1 安装 1.1 简介 pytorch可用gpu加速&#xff0c;也可以不加速。gpu加速是通过cuda来实现&#xff0c;cuda是nvidia推出的一款运算平台&#xff0c;它可以利用gpu提升运算性能。 所以如果要装带加速的pytorch&#xff0c;需要先装cuda&#xff0c;再装pytorch&#xff0c;如…

【C程序设计】C循环

有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次执行一个…

偏导函数公式以及使用 python 计算

偏导函数 偏导函数是多元函数对其中一个变量的偏导数。对于一个多元函数&#xff0c;其输入变量有两个或更多&#xff0c;而偏导函数则表示对其中一个变量的偏导数&#xff0c;将其他变量视为常数。 设有一个具有 n 个自变量的函数 f(,,...,)&#xff0c;则对于其中的某一个自…

OpenHarmony源码转换器—多线程特性转换

本文讨论了如何将多线程的 Java 代码转换为 OpenHarmony ArkTS 代码​ 一、简介 Java 内存共享模型 以下示例伪代码和示意图展示了如何使用内存共享模型解决生产者消费者问题。 生产者消费者与共享内存间交互示意图 为了避免不同生产者或消费者同时访问一块共享内存的容器时…

通信网络(3)——DHCP Snooping

一、简介 前面一节介绍的DAI技术是基于DHCP Snooping绑定表的&#xff0c;因此本篇文章用于介绍何为DHCP Snooping&#xff0c;它是如何生成绑定表的 二、DHCP Snooping诞生背景 由于DHCP报文和ARP报文一样没有认证机制&#xff0c;因此和ARP报文一样&#xff0c;别人给我什…

Java基础-----集合类(四)

文章目录 1. Iterator和ListIterator1.1 简介1.2 常用方法 2. remove方法2.1 比较foreach方式和迭代器方式删除元素2.2 找原因 -- 迭代器删除操作源码 1. Iterator和ListIterator 1.1 简介 1.Iterator 可以遍历List集合&#xff0c;也可以遍历Set集合&#xff1b; ListIterat…

Linux学习(9)——RAID与服务器的常见故障

目录 一、服务器常见故障 1、系统不停重启进入不了系统 2、卡在开机界面右下角有fA B2 H8 3、系统安装不上 4、如何进入服务器的bios 5、一般进入阵列卡的快捷键 6.网络不通 7.硬盘不识别 二、RAID相关知识 1、RAID的概念 2、RAID功能实现 3、RAID实现的方式 三、…

2024年01月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2024年01月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

2020年认证杯SPSSPRO杯数学建模C题(第一阶段)抗击疫情,我们能做什么全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 C题 抗击疫情&#xff0c;我们能做什么 原题再现&#xff1a; 2020 年 3 月 12 日&#xff0c;世界卫生组织&#xff08;WHO&#xff09;宣布&#xff0c;席卷全球的冠状病毒引发的病毒性肺炎&#xff08;COVID-19&#xff09;是一种大流行病。…

js中函数动态调用

文章目录 一、场景二、方法2.1、动态函数2.2、eval()函数 三、最后 一、场景 在JS开发中&#xff0c;例如有些场景下&#xff0c;后端要求一个功能要请求不同的接口&#xff0c;但是传参及后续逻辑其实都是一样的&#xff0c;有些同学可能会想到在接口url处统一处理就好&#…

51单片机项目(27)——基于51单片机的智能门窗设计

1.功能设计 使用普中51单片机&#xff0c;门窗有自动模式和手动模式。 手动模式下&#xff0c;LCD1602显示屏上显示“manu mode”&#xff0c;通过红外遥控器&#xff0c;控制门窗的开关。其中&#xff0c;按键0代表开窗&#xff0c;按键1代表关窗。&#xff08;使用风扇模拟门…

【Vue2+3入门到实战】(17)VUE之VueCli脚手架自定认创建项目、ESlint代码规范与修复、 ESlint自动修正插件的使用 详细示例

目录 一、本节内容二、VueCli 自定义创建项目三、ESlint代码规范及手动修复1.JavaScript Standard Style 规范说明2.代码规范错误3.手动修正 四、通过eslint插件来实现自动修正 一、本节内容 VueCli脚手架自定认创建项目ESlint代码规范与修复ESlint自动修正插件 二、VueCli 自…

qt 异常汇总

1. C2338 No Q_OBJECT in the class with the signal (编译源文件 ..\..\qt\labelme-master\src\mainwindow.cpp mainwindow头文件中的类没有Q_OBJECT宏定义&#xff0c;或者其子类或者其他依赖没有Q_OBJECT宏定义。 全部qt类都要写上Q_OBJECT. 2. C2385 对connect的访…

uniapp中组件库的Checkbox 复选框 的丰富使用方法

目录 #平台差异说明 #基本使用 #自定义形状 #禁用checkbox #自定义形状 #自定义颜色 #横向排列形式 #横向两端排列形式 API #Checkbox Props #CheckboxGroup Props #CheckboxGroup Event 复选框组件一般用于需要多个选择的场景&#xff0c;该组件功能完整&#xff…

【Github】如何创建一个自己的仓库

一、创建Github账户 不多赘述&#xff0c;进入官网创建账户即可 二、进入个人主页&#xff0c;点击新建仓库 三、按照需求配置仓库信息&#xff0c;点击创建 四、通过git导入代码到仓库 流程大致如下&#xff1a; 1.进入要上传代码的地方&#xff0c;选择打开git命令行界面 2…