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)
		
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我码玄黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值