• Go插件:轻松实现模块化开发与动态功能扩展


    简介

    Go 语言(通常称为 Golang )是一种静态类型、编译型语言。

    golang 并不像动态语言一样,修改了代码后就可以直接生效。

    他必须编译后才能使新代码功能生效。

    这就导致某些特定的场合不适用。比如 tcp 协议动态解析。

    go1.8 版本开始提供了一个创建共享库的新工具:plugins

    golang plugins

    Go 语言的插件机制允许开发者在运行时动态加载和执行 Go 编译的插件。

    Go1.8 版本开始引入了对插件的支持,使用go build -buildmode=plugin 可以创建一个插件,这通常是一个包含可导出函数和变量的Go主包编译成的共享库文件 。

    插件在首次打开时会调用其所有包的初始化函数,但不运行 main 函数,并且一旦初始化完成,插件不能被关闭.

    Go插件的优势包括:

    1.动态扩展性:可以在不重启应用的情况下添加或更新功能,对于需要持续运行的服务来说非常重要。

    2.模块化开发:鼓励将复杂应用分解为小的、独立维护的组件,提高了代码的可维护性和复用性。

    3.版本隔离:不同插件间的依赖关系可以独立管理,降低了版本冲突的风险。

    4.安全与沙盒:插件在单独的 goroutine 中运行,提供了一定程度的隔离。

    案例:创建一个tcp协议的动态解析服务

    创建一个plugin_code目录,并创建插件

    plugin.go

    // +build plugin
    package main
    
    import "fmt"
    
    func main()  {
       
    }
    
    
    // 导出的函数,处理函数
    func Handle(res any)(any,error) {
       
    	//此处填写你的数据处理逻辑
    	fmt.Println("res data:",res)
    
    	return res,nil
    
    }
    
    
    

    此插件,接收一个参数,返回处理后的数据和错误

    创建server目录,并编写各种服务

    1. 创建一个 server_factory.go ,写入以下代码
    package server
    
    import (
    	"errors"
    )
    
    // 获取实例
    type ServerFactory interface {
       
    	GetInstance(config any) (ServerInterface, error)
    }
    
    // 监听服务
    type ServerInterface interface {
       
    	InitServer()
    }
    
    
    // 获取实例
    func GetInstance(config map[string]any) (*ServerInterface, error) {
       
    
    	var server ServerInterface
    	var err error
    	protocol, ok := config["protocol"]
    	if !ok {
       
    		return nil, errors.New("config protocol is not find")
    	}
    	protocolString,ok := protocol.(string)
    	if !ok {
       
    		return nil,errors.New("config protocol type is error")
    	}
    
    	switch protocolString {
       
    	case "TCP":
    		server, err = new(TcpFactory).GetInstance(config)
    		
  • 相关阅读:
    最受欢迎的国际棒球锦标赛·棒球7号位
    2614. 对角线上的质数-c语言解法
    【C++编程能力提升】
    疫情之下,企业管理如何做好?疫情防控管理系统助力企业战疫
    Constellation 介绍:Chainlink 黑客马拉松
    2022年最新山东建筑八大员(材料员)模拟真题及答案
    c++---模板篇
    Web3 用例全解析:传统品牌加速进入 Web3 的原因?
    漫步5G-A City,一份独属于上海的浪漫
    软件测试报告包含的主要内容有哪些?
  • 原文地址:https://blog.csdn.net/qq_30333063/article/details/141093293