银川做网站公司,黄冈市建设局官方网站,广告关键词查询,中国建设工程电子信息网目的和需求#xff1a;部分go的核心文件不开源#xff0c;例如验证#xff0c;主程序核心逻辑等等 第一个想法#xff0c;把子程序代码打包成静态文件#xff0c;然后主程序执行
子程序
package mainimport (fmtgithub.com/gogf/gf/v2/os/gfile… 目的和需求部分go的核心文件不开源例如验证主程序核心逻辑等等 第一个想法把子程序代码打包成静态文件然后主程序执行
子程序
package mainimport (fmtgithub.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 (contextfmtgfdemo/api/hello/v1gfdemo/internal/modelgfdemo/internal/servicegithub.com/gogf/gf/v2/frame/ggithub.com/gogf/gf/v2/util/gconvosos/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 -buildmodeplugin -o core.so main.go core.so文件拷贝到主程序路径 core/core.so 主程序
package hello
import (contextfmtgfdemo/api/hello/v1gfdemo/internal/modelgfdemo/internal/servicegithub.com/gogf/gf/v2/frame/ggithub.com/gogf/gf/v2/util/gconvosos/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代码上传在 githubhttps://github.com/gzdzh/gfdemo